这是我的文件C://test.txt的组成 ACBDE FGHIJ
我想从F开始一直读到J. 所以输出是FGHIJ。我将如何使用offset在InputStream中读取。 这是我的部分实现。
InputStream is = null;
byte[] buffer = null;
char c;
try {
is = new FileInputStream("D://test.txt");
buffer = new byte[is.available()];
System.out.println("Characters printed:");
is.read(buffer, 5, 5);
for (byte b : buffer) {
if (b == 0)
// if b is empty
c = '-';
else
c = (char) b;
System.out.print(c);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null)
is.close();
}
请帮助我解决问题:D
答案 0 :(得分:1)
如果你想从第n个角色开始,你可以这样做:
public static void file_foreach_offset( String file, int offset, IntConsumer c) throws IOException {
try(Stream<String> stream = Files.lines(Paths.get(file))) {
stream.flatMapToInt(String::chars)
.skip(offset)
.forEach(c);
}
}
答案 1 :(得分:1)
offset
read()
参数是缓冲区的偏移量,而不是文件的偏移量。你要找的是seek()
方法,后跟read()
,偏移量为零。
注意:这是对available()
的经典误用。见Javadoc。有一个特定的警告,不要将它用作输入流的长度。
答案 2 :(得分:0)
看here,第二个参数是“目标数组中的起始偏移量”不是文件偏移量,我想你错了,所以你可以尝试阅读所有这些然后找到第一个空格字符然后开始打印,如下所示:
InputStream is = null;
byte[] buffer = null;
char c;
boolean canPrint = false;
try {
is = new FileInputStream("/Users/smy/test.txt");
buffer = new byte[is.available()];
System.out.println("Characters printed:"+is.available());
is.read(buffer, 0, is.available());
for (byte b : buffer) {
if ((char)b == ' ')
// if b is empty
canPrint = true;
else{
c = (char) b;
if (canPrint){
System.out.print(c);
}}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null)
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
或者您可以使用RandomAccessFile为文件设置偏移量,然后开始阅读。