1 5 package org.h2.test.db; 6 7 import java.io.ByteArrayInputStream ; 8 import java.io.CharArrayReader ; 9 import java.io.InputStream ; 10 import java.io.Reader ; 11 import java.io.StringReader ; 12 import java.sql.Blob ; 13 import java.sql.Clob ; 14 import java.sql.Connection ; 15 import java.sql.DatabaseMetaData ; 16 import java.sql.PreparedStatement ; 17 import java.sql.ResultSet ; 18 import java.sql.Savepoint ; 19 import java.sql.Statement ; 20 import java.util.Random ; 21 22 import org.h2.test.TestBase; 23 import org.h2.util.IOUtils; 24 import org.h2.util.StringUtils; 25 26 29 30 public class TestLob extends TestBase { 31 32 public void test() throws Exception { 33 if(config.memory) { 34 return; 35 } 36 testLobTransactions(10); 37 testLobTransactions(10000); 38 testLobRollbackStop(); 39 testLobCopy(); 40 testLobHibernate(); 41 testLobCopy(false); 42 testLobCopy(true); 43 testLobCompression(false); 44 testLobCompression(true); 45 testManyLobs(); 46 testClob(); 47 testUpdateLob(); 48 testLobReconnect(); 49 testLob(false); 50 testLob(true); 51 testJavaObject(); 52 } 53 54 private void testLobTransactions(int spaceLen) throws Exception { 55 if(config.logMode == 0) { 56 return; 57 } 58 deleteDb("lob"); 59 Connection conn = reconnect(null); 60 conn.createStatement().execute("CREATE TABLE TEST(ID IDENTITY, DATA CLOB, DATA2 VARCHAR)"); 61 conn.setAutoCommit(false); 62 Random random = new Random (0); 63 int rows = 0; 64 Savepoint sp = null; 65 int len = getSize(100, 400); 66 for(int i=0; i<len; i++) { 67 switch(random.nextInt(10)) { 68 case 0: 69 trace("insert"); 70 conn.createStatement().execute("INSERT INTO TEST(DATA, DATA2) VALUES('"+i+"' || SPACE("+spaceLen+"), '"+i+"')"); 71 rows++; 72 break; 73 case 1: 74 if(rows > 0) { 75 trace("delete"); 76 conn.createStatement().execute("DELETE FROM TEST WHERE ID=" + random.nextInt(rows)); 77 } 78 break; 79 case 2: 80 if(rows > 0) { 81 trace("update"); 82 conn.createStatement().execute("UPDATE TEST SET DATA='x' || DATA, DATA2='x' || DATA2 WHERE ID=" + random.nextInt(rows)); 83 } 84 break; 85 case 3: 86 if(rows > 0) { 87 trace("commit"); 88 conn.commit(); 89 sp = null; 90 } 91 break; 92 case 4: 93 if(rows > 0) { 94 trace("rollback"); 95 conn.rollback(); 96 sp = null; 97 } 98 break; 99 case 5: 100 trace("savepoint"); 101 sp = conn.setSavepoint(); 102 break; 103 case 6: 104 if(sp != null) { 105 trace("rollback to savepoint"); 106 conn.rollback(sp); 107 } 108 break; 109 case 7: 110 if(rows > 0) { 111 trace("checkpoint"); 112 conn.createStatement().execute("CHECKPOINT"); 113 trace("shutdown immediately"); 114 conn.createStatement().execute("SHUTDOWN IMMEDIATELY"); 115 trace("shutdown done"); 116 conn = reconnect(null); 117 conn.setAutoCommit(false); 118 sp = null; 119 } 120 break; 121 } 122 ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM TEST"); 123 while(rs.next()) { 124 String d1 = rs.getString("DATA").trim(); 125 String d2 = rs.getString("DATA2").trim(); 126 check(d1, d2); 127 } 128 129 } 130 conn.close(); 131 } 132 133 private void testLobRollbackStop() throws Exception { 134 if(config.logMode == 0) { 135 return; 136 } 137 deleteDb("lob"); 138 Connection conn = reconnect(null); 139 conn.createStatement().execute("CREATE TABLE TEST(ID INT PRIMARY KEY, DATA CLOB)"); 140 conn.createStatement().execute("INSERT INTO TEST VALUES(1, SPACE(10000))"); 141 conn.setAutoCommit(false); 142 conn.createStatement().execute("DELETE FROM TEST"); 143 conn.createStatement().execute("CHECKPOINT"); 144 conn.createStatement().execute("SHUTDOWN IMMEDIATELY"); 145 conn = reconnect(null); 146 ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM TEST"); 147 check(rs.next()); 148 rs.getInt(1); 149 check(rs.getString(2).length(), 10000); 150 conn.close(); 151 } 152 153 private void testLobCopy() throws Exception { 154 deleteDb("lob"); 155 Connection conn = reconnect(null); 156 Statement stat = conn.createStatement(); 157 stat.execute("create table test(id int, data clob)"); 158 stat.execute("insert into test values(1, space(1000));"); 159 stat.execute("insert into test values(2, space(1000));"); 160 stat.execute("create table test2(id int, data clob);"); 161 stat.execute("insert into test2 select * from test;"); 162 stat.execute("drop table test;"); 163 stat.execute("select * from test2;"); 164 stat.execute("update test2 set id=id;"); 165 stat.execute("select * from test2;"); 166 conn.close(); 167 } 168 169 private void testLobHibernate() throws Exception { 170 deleteDb("lob"); 171 Connection conn0 = reconnect(null); 172 173 conn0.getAutoCommit(); 174 conn0.setAutoCommit(false); 175 DatabaseMetaData dbMeta0 = 176 conn0.getMetaData(); 177 dbMeta0.getDatabaseProductName(); 178 dbMeta0.getDatabaseMajorVersion(); 179 dbMeta0.getDatabaseProductVersion(); 180 dbMeta0.getDriverName(); 181 dbMeta0.getDriverVersion(); 182 dbMeta0.supportsResultSetType(1004); 183 dbMeta0.supportsBatchUpdates(); 184 dbMeta0.dataDefinitionCausesTransactionCommit(); 185 dbMeta0.dataDefinitionIgnoredInTransactions(); 186 dbMeta0.supportsGetGeneratedKeys(); 187 conn0.getAutoCommit(); 188 conn0.getAutoCommit(); 189 conn0.commit(); 190 conn0.setAutoCommit(true); 191 Statement stat0 = 192 conn0.createStatement(); 193 stat0.executeUpdate("drop table CLOB_ENTITY if exists"); 194 stat0.getWarnings(); 195 stat0.executeUpdate("create table CLOB_ENTITY (ID bigint not null, SER_DATA clob, CLOB_DATA clob, primary key (ID))"); 196 stat0.getWarnings(); 197 stat0.close(); 198 conn0.getWarnings(); 199 conn0.clearWarnings(); 200 conn0.setAutoCommit(false); 201 conn0.getAutoCommit(); 202 conn0.getAutoCommit(); 203 PreparedStatement prep0 = 204 conn0.prepareStatement("select max(ID) from CLOB_ENTITY"); 205 ResultSet rs0 = 206 prep0.executeQuery(); 207 rs0.next(); 208 rs0.getLong(1); 209 rs0.wasNull(); 210 rs0.close(); 211 prep0.close(); 212 conn0.getAutoCommit(); 213 PreparedStatement prep1 = 214 conn0.prepareStatement("insert into CLOB_ENTITY (SER_DATA, CLOB_DATA, ID) values (?, ?, ?)"); 215 prep1.setNull(1, 2005); 216 StringBuffer buff = new StringBuffer (10000); 217 for(int i=0; i<10000; i++) { 218 buff.append((char)('0' + (i%10))); 219 } 220 Reader x = new StringReader (buff.toString()); 221 prep1.setCharacterStream(2, x, 10000); 222 prep1.setLong(3, 1); 223 prep1.addBatch(); 224 prep1.executeBatch(); 225 prep1.close(); 226 conn0.getAutoCommit(); 227 conn0.getAutoCommit(); 228 conn0.commit(); 229 conn0.isClosed(); 230 conn0.getWarnings(); 231 conn0.clearWarnings(); 232 conn0.getAutoCommit(); 233 conn0.getAutoCommit(); 234 PreparedStatement prep2 = 235 conn0.prepareStatement("select clobholdin0_.ID as ID0_0_, clobholdin0_.SER_DATA as SER2_0_0_, clobholdin0_.CLOB_DATA as CLOB3_0_0_ from CLOB_ENTITY clobholdin0_ where clobholdin0_.ID=?"); 236 prep2.setLong(1, 1); 237 ResultSet rs1 = 238 prep2.executeQuery(); 239 rs1.next(); 240 rs1.getCharacterStream("SER2_0_0_"); 241 Clob clob0 = 242 rs1.getClob("CLOB3_0_0_"); 243 rs1.wasNull(); 244 rs1.next(); 245 rs1.close(); 246 prep2.getMaxRows(); 247 prep2.getQueryTimeout(); 248 prep2.close(); 249 conn0.getAutoCommit(); 250 Reader r = clob0.getCharacterStream(); 251 for(int i=0; i<10000; i++) { 252 int ch = r.read(); 253 if(ch != ('0' + (i%10))) { 254 error("expected "+ (char)('0' + (i%10)) + " got: " + ch + " (" + (char)ch + ")"); 255 } 256 } 257 int ch = r.read(); 258 if(ch != -1) { 259 error("expected -1 got: " + ch ); 260 } 261 conn0.close(); 262 } 263 264 private void testLobCopy(boolean compress) throws Exception { 265 deleteDb("lob"); 266 Connection conn; 267 conn = reconnect(null); 268 Statement stat = conn.createStatement(); 269 if(compress) { 270 conn.createStatement().execute("SET COMPRESS_LOB LZF"); 271 } else { 272 conn.createStatement().execute("SET COMPRESS_LOB NO"); 273 } 274 conn = reconnect(conn); 275 stat = conn.createStatement(); 276 ResultSet rs; 277 rs = stat.executeQuery("select value from information_schema.settings where NAME='COMPRESS_LOB'"); 278 rs.next(); 279 check(rs.getString(1), compress ? "LZF" : "NO"); 280 checkFalse(rs.next()); 281 stat.execute("create table test(text clob)"); 282 stat.execute("create table test2(text clob)"); 283 StringBuffer buff = new StringBuffer (); 284 for(int i=0; i<1000; i++) { 285 buff.append(' '); 286 } 287 String spaces = buff.toString(); 288 stat.execute("insert into test values('"+spaces+"')"); 289 stat.execute("insert into test2 select * from test"); 290 rs = stat.executeQuery("select * from test2"); 291 rs.next(); 292 check(rs.getString(1), spaces); 293 stat.execute("drop table test"); 294 rs = stat.executeQuery("select * from test2"); 295 rs.next(); 296 check(rs.getString(1), spaces); 297 stat.execute("alter table test2 add column id int before text"); 298 rs = stat.executeQuery("select * from test2"); 299 rs.next(); 300 check(rs.getString("text"), spaces); 301 conn.close(); 302 } 303 304 private void testLobCompression(boolean compress) throws Exception { 305 deleteDb("lob"); 306 Connection conn; 307 conn = reconnect(null); 308 if(compress) { 309 conn.createStatement().execute("SET COMPRESS_LOB LZF"); 310 } else { 311 conn.createStatement().execute("SET COMPRESS_LOB NO"); 312 } 313 conn.createStatement().execute("CREATE TABLE TEST(ID INT PRIMARY KEY, C CLOB)"); 314 PreparedStatement prep = conn.prepareStatement("INSERT INTO TEST VALUES(?, ?)"); 315 long time = System.currentTimeMillis(); 316 int len = getSize(10, 40); 317 if(config.networked && config.big) { 318 len = 5; 319 } 320 StringBuffer buff = new StringBuffer (); 321 for(int i=0; i<100; i++) { 322 buff.append(StringUtils.xmlNode("content", null, "This is a test " + i)); 323 } 324 String xml = buff.toString(); 325 for(int i=0; i<len; i++) { 326 prep.setInt(1, i); 327 prep.setString(2, xml + i); 328 prep.execute(); 329 } 330 for(int i=0; i<len; i++) { 331 ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM TEST"); 332 while(rs.next()) { 333 if(i==0) { 334 check(xml + rs.getInt(1), rs.getString(2)); 335 } else { 336 Reader r = rs.getCharacterStream(2); 337 String result = IOUtils.readStringAndClose(r, -1); 338 check(xml + rs.getInt(1), result); 339 } 340 } 341 } 342 time = System.currentTimeMillis() - time; 343 trace("time: " + time +" compress: " + compress); 344 conn.close(); 345 } 346 347 private void testManyLobs() throws Exception { 348 deleteDb("lob"); 349 Connection conn; 350 conn = reconnect(null); 351 conn.createStatement().execute("CREATE TABLE TEST(ID INT PRIMARY KEY, B BLOB, C CLOB)"); 352 int len = getSize(10, 2000); 353 if(config.networked) { 354 len = 100; 355 } 356 357 int start = 1, increment = 19; 358 359 PreparedStatement prep = conn.prepareStatement("INSERT INTO TEST(ID, B, C) VALUES(?, ?, ?)"); 360 for(int i=start; i<len; i+=increment) { 361 int l = i; 362 prep.setInt(1, i); 363 prep.setBinaryStream(2, getRandomStream(l, i), -1); 364 prep.setCharacterStream(3, getRandomReader(l, i), -1); 365 prep.execute(); 366 } 367 368 conn = reconnect(conn); 369 ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM TEST ORDER BY ID"); 370 while(rs.next()) { 371 int i = rs.getInt("ID"); 372 Blob b = rs.getBlob("B"); 373 Clob c = rs.getClob("C"); 374 int l = i; 375 check(b.length(), l); 376 check(c.length(), l); 377 checkStream(b.getBinaryStream(), getRandomStream(l, i), -1); 378 checkReader(c.getCharacterStream(), getRandomReader(l, i), -1); 379 } 380 381 prep = conn.prepareStatement("UPDATE TEST SET B=?, C=? WHERE ID=?"); 382 for(int i=start; i<len; i+=increment) { 383 int l = i; 384 prep.setBinaryStream(1, getRandomStream(l, -i), -1); 385 prep.setCharacterStream(2, getRandomReader(l, -i), -1); 386 prep.setInt(3, i); 387 prep.execute(); 388 } 389 390 conn = reconnect(conn); 391 rs = conn.createStatement().executeQuery("SELECT * FROM TEST ORDER BY ID"); 392 while(rs.next()) { 393 int i = rs.getInt("ID"); 394 Blob b = rs.getBlob("B"); 395 Clob c = rs.getClob("C"); 396 int l = i; 397 check(b.length(), l); 398 check(c.length(), l); 399 checkStream(b.getBinaryStream(), getRandomStream(l, -i), -1); 400 checkReader(c.getCharacterStream(), getRandomReader(l, -i), -1); 401 } 402 403 conn.close(); 404 } 405 406 private void testClob() throws Exception { 407 deleteDb("lob"); 408 Connection conn; 409 conn = reconnect(null); 410 conn.createStatement().execute("CREATE TABLE TEST(ID IDENTITY, C CLOB)"); 411 PreparedStatement prep = conn.prepareStatement("INSERT INTO TEST(C) VALUES(?)"); 412 prep.setCharacterStream(1, new CharArrayReader ("Bohlen".toCharArray()), "Bohlen".length()); 413 prep.execute(); 414 prep.setCharacterStream(1, new CharArrayReader ("B\u00f6hlen".toCharArray()), "B\u00f6hlen".length()); 415 prep.execute(); 416 prep.setCharacterStream(1, getRandomReader(501, 1), -1); 417 prep.execute(); 418 prep.setCharacterStream(1, getRandomReader(1501, 2), 401); 419 prep.execute(); 420 conn = reconnect(conn); 421 ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM TEST ORDER BY ID"); 422 rs.next(); 423 check("Bohlen", rs.getString("C")); 424 checkReader(new CharArrayReader ("Bohlen".toCharArray()), rs.getCharacterStream("C"), -1); 425 rs.next(); 426 checkReader(new CharArrayReader ("B\u00f6hlen".toCharArray()), rs.getCharacterStream("C"), -1); 427 rs.next(); 428 checkReader(getRandomReader(501, 1), rs.getCharacterStream("C"), -1); 429 Clob clob = rs.getClob("C"); 430 checkReader(getRandomReader(501, 1), clob.getCharacterStream(), -1); 431 check(clob.length(), 501); 432 rs.next(); 433 checkReader(getRandomReader(401, 2), rs.getCharacterStream("C"), -1); 434 checkReader(getRandomReader(1500, 2), rs.getCharacterStream("C"), 401); 435 clob = rs.getClob("C"); 436 checkReader(getRandomReader(1501, 2), clob.getCharacterStream(), 401); 437 checkReader(getRandomReader(401, 2), clob.getCharacterStream(), 401); 438 check(clob.length(), 401); 439 checkFalse(rs.next()); 440 conn.close(); 441 } 442 443 private Connection reconnect(Connection conn) throws Exception { 444 long time = System.currentTimeMillis(); 445 if(conn != null) { 446 conn.close(); 447 } 448 conn = getConnection("lob"); 449 trace("re-connect="+(System.currentTimeMillis()-time)); 450 return conn; 451 } 452 453 454 void testUpdateLob() throws Exception { 455 deleteDb("lob"); 456 Connection conn; 457 conn = reconnect(null); 458 459 PreparedStatement prep = conn.prepareStatement( 460 "CREATE TABLE IF NOT EXISTS p( id int primary key, rawbyte BLOB ); "); 461 prep.execute(); 462 prep.close(); 463 464 prep = conn.prepareStatement("INSERT INTO p(id) VALUES(?);"); 465 for (int i = 0; i < 10; i++) { 466 prep.setInt(1, i); 467 prep.execute(); 468 } 469 prep.close(); 470 471 prep = conn.prepareStatement("UPDATE p set rawbyte=? WHERE id=?"); 472 for (int i = 0; i < 8; i++) { 473 prep.setBinaryStream(1, getRandomStream(10000, i), 0); 474 prep.setInt(2, i); 475 prep.execute(); 476 } 477 prep.close(); 478 conn.commit(); 479 480 conn = reconnect(conn); 481 482 conn.setAutoCommit(true); 483 prep = conn.prepareStatement("UPDATE p set rawbyte=? WHERE id=?"); 484 for (int i = 8; i < 10; i++) { 485 prep.setBinaryStream(1, getRandomStream(10000, i), 0); 486 prep.setInt(2, i); 487 prep.execute(); 488 } 489 prep.close(); 490 491 prep = conn.prepareStatement("SELECT * from p"); 492 ResultSet rs = prep.executeQuery(); 493 while (rs.next()) { 494 for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) { 495 rs.getMetaData().getColumnName(i); 496 rs.getString(i); 497 } 498 } 499 conn.close(); 500 } 501 502 void testLobReconnect() throws Exception { 503 deleteDb("lob"); 504 Connection conn = reconnect(null); 505 Statement stat = conn.createStatement(); 506 stat.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, TEXT CLOB)"); 507 PreparedStatement prep; 508 prep = conn.prepareStatement("INSERT INTO TEST VALUES(1, ?)"); 509 String s = new String (getRandomChars(10000, 1)); 510 byte[] data = s.getBytes("UTF-8"); 511 prep.setBinaryStream(1, new ByteArrayInputStream (data), 0); 512 prep.execute(); 513 514 conn = reconnect(conn); 515 stat = conn.createStatement(); 516 ResultSet rs = stat.executeQuery("SELECT * FROM TEST WHERE ID=1"); 517 rs.next(); 518 checkStream(new ByteArrayInputStream (data), rs.getBinaryStream("TEXT"), -1); 519 520 521 prep = conn.prepareStatement("UPDATE TEST SET TEXT = ?"); 522 s = new String (getRandomChars(10201, 1)); 523 prep.setBinaryStream(1, new ByteArrayInputStream (data), 0); 524 prep.execute(); 525 526 conn = reconnect(conn); 527 stat = conn.createStatement(); 528 rs = stat.executeQuery("SELECT * FROM TEST WHERE ID=1"); 529 rs.next(); 530 checkStream(new ByteArrayInputStream (data), rs.getBinaryStream("TEXT"), -1); 531 532 stat.execute("DROP TABLE IF EXISTS TEST"); 533 conn.close(); 534 } 535 536 void testLob(boolean clob) throws Exception { 537 deleteDb("lob"); 538 Connection conn = reconnect(null); 539 conn = reconnect(conn); 540 Statement stat = conn.createStatement(); 541 stat.execute("DROP TABLE IF EXISTS TEST"); 542 PreparedStatement prep; 543 ResultSet rs; 544 long time; 545 stat.execute("CREATE TABLE TEST(ID INT PRIMARY KEY, VALUE "+(clob?"CLOB":"BLOB")+")"); 546 547 int len = getSize(1, 1000); 548 if(config.networked && config.big) { 549 len = 100; 550 } 551 552 time = System.currentTimeMillis(); 553 prep = conn.prepareStatement("INSERT INTO TEST VALUES(?, ?)"); 554 for(int i=0; i<len; i+=(i+i+1)) { 555 prep.setInt(1, i); 556 int size = i*i; 557 if(clob) { 558 prep.setCharacterStream(2, getRandomReader(size, i), 0); 559 } else { 560 prep.setBinaryStream(2, getRandomStream(size, i), 0); 561 } 562 prep.execute(); 563 } 564 trace("insert="+(System.currentTimeMillis()-time)); 565 traceMemory(); 566 conn = reconnect(conn); 567 568 time = System.currentTimeMillis(); 569 prep = conn.prepareStatement("SELECT ID, VALUE FROM TEST"); 570 rs = prep.executeQuery(); 571 while(rs.next()) { 572 int id = rs.getInt("ID"); 573 int size = id*id; 574 if(clob) { 575 Reader rt = rs.getCharacterStream(2); 576 checkReader(rt, getRandomReader(size, id), -1); 577 checkReader((Reader )rs.getObject(2), getRandomReader(size, id), -1); 578 } else { 579 InputStream in = rs.getBinaryStream(2); 580 checkStream(in, getRandomStream(size, id), -1); 581 checkStream((InputStream )rs.getObject(2), getRandomStream(size, id), -1); 582 } 583 } 584 trace("select="+(System.currentTimeMillis()-time)); 585 traceMemory(); 586 587 conn = reconnect(conn); 588 589 time = System.currentTimeMillis(); 590 prep = conn.prepareStatement("DELETE FROM TEST WHERE ID=?"); 591 for(int i=0; i<len; i++) { 592 prep.setInt(1, i); 593 prep.executeUpdate(); 594 } 595 trace("delete="+(System.currentTimeMillis()-time)); 596 traceMemory(); 597 conn = reconnect(conn); 598 599 conn.setAutoCommit(false); 600 prep = conn.prepareStatement( 601 "INSERT INTO TEST VALUES(1, ?)"); 602 if(clob) { 603 prep.setCharacterStream(1, getRandomReader(0, 0), 0); 604 } else { 605 prep.setBinaryStream(1, getRandomStream(0, 0), 0); 606 } 607 prep.execute(); 608 conn.rollback(); 609 prep.execute(); 610 conn.commit(); 611 612 conn.createStatement().execute("DELETE FROM TEST WHERE ID=1"); 613 conn.rollback(); 614 conn.createStatement().execute("DELETE FROM TEST WHERE ID=1"); 615 conn.commit(); 616 617 conn.createStatement().execute("DROP TABLE TEST"); 618 conn.close(); 619 } 620 621 void testJavaObject() throws Exception { 622 deleteDb("lob"); 623 Connection conn = getConnection("lob"); 624 conn.createStatement().execute("CREATE TABLE TEST(ID INT PRIMARY KEY, DATA OTHER)"); 625 PreparedStatement prep = conn.prepareStatement("INSERT INTO TEST VALUES(1, ?)"); 626 prep.setObject(1, new TestLobObject("abc")); 627 prep.execute(); 628 ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM TEST"); 629 rs.next(); 630 Object oa = rs.getObject(2); 631 TestLobObject a = (TestLobObject)oa; 632 Object ob = rs.getObject("DATA"); 633 TestLobObject b = (TestLobObject)ob; 634 check(a.data, "abc"); 635 check(b.data, "abc"); 636 checkFalse(rs.next()); 637 conn.close(); 638 } 639 640 private void checkStream(InputStream a, InputStream b, int len) throws Exception { 641 a.read(new byte[0]); 643 b.read(new byte[0]); 644 a.read(new byte[10], 3, 0); 645 b.read(new byte[10], 0, 0); 646 647 for(int i=0; len<0 || i<len; i++) { 648 int ca = a.read(); 649 a.read(new byte[0]); 650 int cb = b.read(); 651 check(ca, cb); 652 if(ca==-1) { 653 break; 654 } 655 } 656 a.read(new byte[10], 3, 0); 657 b.read(new byte[10], 0, 0); 658 a.read(new byte[0]); 659 b.read(new byte[0]); 660 a.close(); 661 b.close(); 662 } 663 664 private void checkReader(Reader a, Reader b, int len) throws Exception { 665 for(int i=0; len<0 || i<len; i++) { 666 int ca = a.read(); 667 int cb = b.read(); 668 check(ca, cb); 669 if(ca==-1) { 670 break; 671 } 672 } 673 a.close(); 674 b.close(); 675 } 676 677 private Reader getRandomReader(int len, int seed) { 678 return new CharArrayReader (getRandomChars(len, seed)); 679 } 680 681 private char[] getRandomChars(int len, int seed) { 682 Random random = new Random (seed); 683 char[] buff = new char[len]; 684 for(int i=0; i<len; i++) { 685 char ch; 686 do { 687 ch = (char)random.nextInt(Character.MAX_VALUE); 688 } while(ch >= 0xd800 && ch <= 0xdfff); 690 buff[i] = ch; 691 } 692 return buff; 693 } 694 695 private InputStream getRandomStream(int len, int seed) { 696 Random random = new Random (seed); 697 byte[] buff = new byte[len]; 698 random.nextBytes(buff); 699 return new ByteArrayInputStream (buff); 700 } 701 702 } 703 | Popular Tags |