java - Why is this loop becoming infinite when using String.valueOf or Float.toString? -


i reading in bytes file using fileinputstream. code (in correct form) follows:

string s = ""; try {         file file = new file(...);         fileinputstream file_input = new fileinputstream(file);         datainputstream data_in = new datainputstream(file_input );          while (true) {             try {                 (int index = 0; index < 4; index++) {                     bytearray[index] = data_in.readbyte();                 }                      } catch (eofexception eof) {                 break;             }              float f = readfloatlittleendian(bytearray); // transforms 4 bytes float             //s += float.tostring(f); <- here's problem          }         data_in.close();     } catch (ioexception e) {         system.err.println(e.tostring());     } } system.out.print(s); 

if run code is, loop finishes when reading of file , transforming each set of 4 bytes float.

however, if uncomment line, file never finishes, , seems loop through file on , over. also, printing f (without using float.tostring or string.valueof) not turn infinite loop.

the loop not become infinite - grossly inefficient. problem += on java.lang.string produces new immutable object, discarding 1 held before. each time makes copy, making process o(n2) in terms of number of entries in file.

the fix straightforward - replace string s stringbuilder s, , use append in place of +=.

stringbuilder s = new stringbuilder(); try {     file file = new file(...);     fileinputstream file_input = new fileinputstream(file);     datainputstream data_in = new datainputstream(file_input );     while (true) {         try {             (int index = 0; index < 4; index++) {                 bytearray[index] = data_in.readbyte();             }                  } catch (eofexception eof) {             break;         }         float f = readfloatlittleendian(bytearray); // transforms 4 bytes float         s.append(f);      }     data_in.close(); } catch (ioexception e) {     system.err.println(e.tostring()); } system.out.print(s); 

Comments

Popular posts from this blog

PHPMotion implementation - URL based videos (Hosted on separate location) -

javascript - Using Windows Media Player as video fallback for video tag -

c# - Unity IoC Lifetime per HttpRequest for UserStore -