我对Scanner有一种奇怪的行为.它将使用我在使用Scanner(FileInputStream)构造函数时使用的一组特定文件,但它不会与Scanner(File)构造函数一起使用.
Scanner(File)Scanner s = new Scanner(new File("file"));
while(s.hasNextLine()) {
System.out.println(s.nextLine());
}
Run Code Online (Sandbox Code Playgroud)
结果:没有输出
Scanner(FileInputStream)Scanner s = new Scanner(new FileInputStream(new File("file")));
while(s.hasNextLine()) {
System.out.println(s.nextLine());
}
Run Code Online (Sandbox Code Playgroud)
结果:文件内容输出到控制台.
输入文件是包含单个类的java文件.
我以编程方式(在Java中)仔细检查:
Scanner(File)在这种情况下通常适合我,我不知道为什么现在没有.
今天我试着重构这个代码,它从目录中的文件中读取id,
Set<Long> ids = new HashSet<>();
for (String fileName : fileSystem.list("my-directory")) {
InputStream stream = fileSystem.openInputStream(fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
String line;
while ((line = br.readLine()) != null) {
ids.add(Long.valueOf(line.trim()));
}
br.close();
}
Run Code Online (Sandbox Code Playgroud)
使用流api
Set<Long> ids = fileSystem.list("my-directory").stream()
.map(fileName -> fileSystem::openInputStream)
.map(is -> new BufferedReader(new InputStreamReader(is)))
.flatMap(BufferedReader::lines)
.map(String::trim)
.map(Long::valueOf)
.collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
然后我发现IO流不会被关闭,我没有看到一种简单的方法来关闭它们,因为它们是在管道内创建的.
有任何想法吗?
upd:示例中的FileSystem是HDFS,Files#lines不能使用类似的方法.
`我不确定要插入什么代码甚至在哪里,但我想检查我输入的数字是一个奇数.
import java.io.*;
import javax.swing.JOptionPane;
public class Diamond {
public static void main(String [] args) throws IOException {
BufferedReader stdin = new BufferedReader (new InputStreamReader (System.in));
String input;
int num;
System.out.println("input number: ");
input = stdin.readLine ();
num = Integer.parseInt(input);
if (num % 2 ==1){
int d = num;
int e = 0;
for (int a = 0; a <= num; a++) {
for (int c = d; c>= 1; c-- )
System.out.print(" ");
d-=1;
for (int b = 1; …Run Code Online (Sandbox Code Playgroud) 我有一些像这样的代码:
PrintWriter pw = new PrintWriter(new BufferedReader(....));
for(int i=0; i<10; i++) {
pw.println("a");
pw.flush();// flush each time when println()?
}
pw.close();
Run Code Online (Sandbox Code Playgroud)
每个'for'语句中的flush()是否必然?我听说flush()会在调用close()时自动调用.如果我写这样的代码:
PrintWriter pw = new PrintWriter(new BufferedReader(....), true);
Run Code Online (Sandbox Code Playgroud)
我不会再写pw.flush()了吗?谢谢.
我有两种方法可以使用FileReader和Other File InputStream读取java文件中的文本文件
FileReader fr=new FileReader("C:\\testq\\test.txt");
BufferedReader br=new BufferedReader(fr);
String s;
while((s=br.readLine())!=null){
System.out.println("value are "+s);
}
Run Code Online (Sandbox Code Playgroud)
和其他是
FileInputStream fstream = new FileInputStream("C:\\testnew\\out.text");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null){
System.out.println (strLine);
}
Run Code Online (Sandbox Code Playgroud)
虽然两者都给我输出......我只是想知道哪种方法最好.
该RandomAccessFile构造函数接受一个mode字符串,指定文件应该如何打开.
我对模式"rws"和"rwd"模式之间的区别感到困惑.
这是文档所说的内容:
"rws"用于读写,与"rw"一样,并且还要求将文件内容或元数据的每次更新同步写入底层存储设备.
"rwd"用于读写,与"rw"一样,并且还要求将文件内容的每次更新同步写入底层存储设备.
[...]
"rwd"模式可用于减少执行的I/O操作的数量.使用"rwd"只需要将文件内容的更新写入存储; 使用"rws"需要更新文件的内容及其要写入的元数据,这通常需要至少一个低级别的I/O操作.
...并没有解释什么metadata意思.这是否意味着"rws"更新文件系统上的最后修改时间戳,而"rwd"不是?
我正在通过BufferedReader读取文件
String filename = ...
br = new BufferedReader( new FileInputStream(filename));
while (true) {
String s = br.readLine();
if (s == null) break;
...
}
Run Code Online (Sandbox Code Playgroud)
我需要知道线条是否以'\n'或'\ r \n'分隔是否有我能找到的方法?
我不想打开FileInputStream以便最初扫描它.理想情况下,我想询问BufferedReader,因为它必须知道.
我很高兴覆盖BufferedReader来破解它,但我真的不想打开文件流两次.
谢谢,
注意:当前行分隔符(由System.getProperty("line.separator")返回)无法使用,因为该文件可能已由另一个应用程序在另一个操作系统上写入.
我正在使用BufferedReader.readLine()方法从远程服务器读取响应(用C语言编写,我无法访问源代码).
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
while((line = br.readLine())!=null){
[...]
}
Run Code Online (Sandbox Code Playgroud)
但它总是阻塞在最后一行,直到它超时.所以我使用了以下代码:
int b;
while(true){
b = in.read;
[...]
}
Run Code Online (Sandbox Code Playgroud)
我发现读取的最后一个字节的整数值为13,我认为这是一个回车,对吧?
那么为什么readLine方法会阻塞?服务器通常如何发出信号流结束信号?谢谢.
如何mark()和reset()方法一步一步完成(在下面的代码中)?我试着编写自己的例子,但是开始抛出错误的标记异常或类似的东西,我无法理解在这段代码中放置标记和重置方法有什么意义,因为我看不出这个或没有区别.
import java.io.*;
class BufferedInputStreamDemo {
public static void main(String args[]) {
String s = "© is a copyright symbol, "
+ "however © isn't.\n";
byte buf[] = s.getBytes();
ByteArrayInputStream in = new ByteArrayInputStream(buf);
int c;
boolean marked = false;
//try_with_resources
try (BufferedInputStream f = new BufferedInputStream(in)) {
while ((c = f.read()) != -1) {
switch (c) {
case '&':
if (!marked) {
f.mark(32);
marked = true;
} else {
marked = false;
}
break;
case …Run Code Online (Sandbox Code Playgroud) 1)缓冲流如何在后台工作,它们与普通流有什么不同?使用它们的优点是什么?
2)DataInputStream也是以字节为基础的.但它有方法readLine().这里有什么意义?