Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从InputStream或Reader读取长度为n的字符串_Java_Stream - Fatal编程技术网

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),它将只读取已发送的内容