次のコードが「öäüß」を変更するのはなぜですか? (大きなファイルを複数の小さなファイルに分割するために使用しています...)
InputStream is = new BufferedInputStream(new FileInputStream(file));
File newFile;
BufferedWriter bw;
newFile = new File(filePathBase + "." + String.valueOf(files.size() + 1) + fileExtension);
files.add(newFile);
bw = new BufferedWriter(new FileWriter(newFile));
try {
byte[] c = new byte[1024];
int lineCount = 0;
int readChars = 0;
while ( ( readChars = is.read(c) ) != -1 )
for ( int i=0; i<readChars; i++ ) {
bw.write(c[i]);
if ( c[i] == '\n' )
if ( ++lineCount % linesPerFile == 0 ) {
bw.close();
newFile = new File(filePathBase + "." + String.valueOf(files.size() + 1) + fileExtension);
files.add(newFile);
bw = new BufferedWriter(new FileWriter(newFile));
}
}
} finally {
bw.close();
is.close();
}
文字エンコーディングについての私の理解は、各バイトを同じに保つ限り、すべてが同じままであるべきだということです。このコードがバイトを変更するのはなぜですか?
事前にたくさんありがとう〜
==================== ソリューション ====================
@meritonとFileWriter
@Jonathan Rosenne に感謝します。BufferedOutputStream
ただし、すべてを に変更するだけでBufferedOutputStream
は不十分です。遅すぎるためです。ファイルの分割とコピーのコードを改善して、より大きな読み取り配列サイズを含めるようにし、write()
必要な場合にのみ...
File newFile = new File(filePathBase + "." + String.valueOf(files.size() + 1) + fileExtension);
files.add(newFile);
InputStream iS = new BufferedInputStream(new FileInputStream(file));
OutputStream oS = new FileOutputStream(newFile); // BufferedOutputStream wrapper toooo slow!
try {
byte[] c;
if ( linesPerFile > 65536 )
c = new byte[65536];
else
c = new byte[1024];
int lineCount = 0;
int readChars = 0;
while ( ( readChars = iS.read(c) ) != -1 ) {
int from = 0;
for ( int idx=0; idx<readChars; idx++ )
if ( c[idx] == '\n' && ++lineCount % linesPerFile == 0 ) {
oS.write(c, from, idx+1 - from);
oS.close();
from = idx+1;
newFile = new File(filePathBase + "." + String.valueOf(files.size() + 1) + fileExtension);
files.add(newFile);
oS = new FileOutputStream(newFile);
}
oS.write(c, from, readChars - from);
}
} finally {
iS.close();
oS.close();
}