Java 从InputStream或Reader读取长度为n的字符串
我知道我能做到。但我也想知道,有没有一条捷径可以做到这一点?例如:为什么没有具有Java 从InputStream或Reader读取长度为n的字符串,java,stream,Java,Stream,我知道我能做到。但我也想知道,有没有一条捷径可以做到这一点?例如:为什么没有具有公共字符串readString(int-len)的方法prototype是否可以在这个问题中仅使用单个代码来实现我想要的功能 InputStream in = new FileInputStream("abc.txt"); InputStreamReader inReader = new InputStreamReader(in); char[] foo = new char[5]; inReader.read(fo
公共字符串readString(int-len)的方法在Reader
类层次结构中的code>prototype是否可以在这个问题中仅使用单个代码来实现我想要的功能
InputStream in = new FileInputStream("abc.txt");
InputStreamReader inReader = new InputStreamReader(in);
char[] foo = new char[5];
inReader.read(foo);
System.out.println(new String(foo));
// I think this way is too long
// for reading a string that has only 5 character
// from InputStream or Reader
在Python3编程语言中,我可以非常轻松地处理UTF-8和其他文件。考虑下面的代码。
fl = open("abc.txt", mode="r", encoding="utf-8")
fl.read(1) # returns string that has 1 character
fl.read(3) # returns string that has 3 character
我怎样才能用Java点画呢
谢谢
我如何用Java实现它
你已经这样做了
我建议用一种可重用的助手方法,例如
final class IOUtil {
public static String read(Reader in, int len) throws IOException {
char[] buf = new char[len];
int charsRead = in.read(buf);
return (charsRead == -1 ? null : new String(buf, 0, charsRead));
}
}
然后像这样使用它:
try (Reader in = Files.newBufferedReader(Paths.get("abc.txt"), StandardCharsets.UTF_8)) {
System.out.println(IOUtil.read(in, 5));
}
我如何用Java实现它
你已经这样做了
我建议用一种可重用的助手方法,例如
final class IOUtil {
public static String read(Reader in, int len) throws IOException {
char[] buf = new char[len];
int charsRead = in.read(buf);
return (charsRead == -1 ? null : new String(buf, 0, charsRead));
}
}
然后像这样使用它:
try (Reader in = Files.newBufferedReader(Paths.get("abc.txt"), StandardCharsets.UTF_8)) {
System.out.println(IOUtil.read(in, 5));
}
如果要尽最大努力读取指定数量的字符,可以使用
int len = 4;
String result;
try(Reader r = new FileReader("abc.txt")) {
CharBuffer b = CharBuffer.allocate(len);
do {} while(b.hasRemaining() && r.read(b) > 0);
result = b.flip().toString();
}
System.out.println(result);
虽然读取器
读取的字符数可能少于指定的字符数(取决于底层流),但它将在返回或返回-1
以发出流结束的信号之前读取至少一个字符。因此,上面的代码将循环,直到读取了请求的字符数或到达流的末尾
不过,FileReader
通常会一次性读取所有请求的字符,在到达文件末尾时只读取较少的字符。如果您想尽最大努力读取指定数量的字符,可以使用
int len = 4;
String result;
try(Reader r = new FileReader("abc.txt")) {
CharBuffer b = CharBuffer.allocate(len);
do {} while(b.hasRemaining() && r.read(b) > 0);
result = b.flip().toString();
}
System.out.println(result);
虽然读取器
读取的字符数可能少于指定的字符数(取决于底层流),但它将在返回或返回-1
以发出流结束的信号之前读取至少一个字符。因此,上面的代码将循环,直到读取了请求的字符数或到达流的末尾
不过,FileReader
通常会一次性读取所有请求的字符,并且在到达文件末尾时只读取较少的字符。您是在问我们为什么API设计人员没有添加特定的方法?我推测他们并不认为这很重要,因为还有其他方法去做,就像你发现自己一样。还有,它到底应该如何工作?它应该像代码一样读取5个UTF-16字符吗?还是应该读取5个Unicode字符(代码点)?仅供参考:您忽略了read(foo)
的返回值。不要那样做!!!如果文件只有3个字符怎么办?@Andreas,这是我想做的唯一说明。你说得对。你能告诉我做这件事的简单方法吗?助手方法是正确的选择吗?当然是。看(“不要重复你自己”)。你是在问我们为什么API设计师没有添加那个特定的方法?我推测他们并不认为这很重要,因为还有其他方法去做,就像你发现自己一样。还有,它到底应该如何工作?它应该像代码一样读取5个UTF-16字符吗?还是应该读取5个Unicode字符(代码点)?仅供参考:您忽略了read(foo)
的返回值。不要那样做!!!如果文件只有3个字符怎么办?@Andreas,这是我想做的唯一说明。你说得对。你能告诉我做这件事的简单方法吗?助手方法是正确的选择吗?当然是。请参阅(“不要重复你自己”)。但是当字符有3个字节或4个字节时,我应该怎么做?如何检查字符的字节数?因为char数据类型只有两个字节。UTF-8字符可以有3或4个字节。所以,如果我只读取一个具有三个或四个字节的JavaChar数据类型的字符,则不会读取一个或两个字节。这意味着这个助手方法不能一直正常工作。@1只是1抱歉,错过了UTF-8部分。答案已更新。读取器将UTF-8字节转换为Java字符。唯一的问题是当字符来自a时,即当它是一组字符时,上面的代码将拆分该对。但同样,您从未定义len
是char
计数还是Unicode代码点计数。但是Reader.read(char[])
不能保证填充整个数组。@Holger True,但在读取文件时会这样做(除非文件结尾)。如果读取通信流(例如HTTP),它将只读取到目前为止接收到的内容,因为它不知道是否会收到更多内容,但将至少等待1个字节。如果您可能对comm.Reader使用该方法,则可以添加循环以继续读取,直到读取了len
字符(或数据结束)。这就是我在回答中所做的,但是使用CharBuffer
可以避免开发人员手动处理位置和剩余长度。对于未压缩的本地文件,一次读取通常就足够了,但必须明确指出解决方案的局限性。但是,当字符有3个字节或4个字节时,我该怎么办?如何检查字符的字节数?因为char数据类型只有两个字节。UTF-8字符可以有3或4个字节。所以,如果我只读取一个具有三个或四个字节的JavaChar数据类型的字符,则不会读取一个或两个字节。这意味着这个助手方法不能一直正常工作。@1只是1抱歉,错过了UTF-8部分。答案已更新。读取器将UTF-8字节转换为Java字符。唯一的问题是当字符来自a时,即当它是一组字符时,上面的代码将拆分该对。但同样,您从未定义len
是char
计数还是Unicode代码点计数。但是Reader.read(char[])
不能保证填充整个数组。@Holger True,但在读取文件时会这样做(除非文件结尾)。如果读取通信流(例如HTTP),它将只读取已发送的内容