标签: java-io

Java Scanner(文件)行为不当,但Scanner(FIleInputStream)始终使用相同的文件

我对Scanner有一种奇怪的行为.它将使用我在使用Scanner(FileInputStream)构造函数时使用的一组特定文件,但它不会与Scanner(File)构造函数一起使用.

情况1: Scanner(File)

Scanner s = new Scanner(new File("file"));
while(s.hasNextLine()) {
    System.out.println(s.nextLine());
}
Run Code Online (Sandbox Code Playgroud)

结果:没有输出

案例2: 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)在这种情况下通常适合我,我不知道为什么现在没有.

java java.util.scanner java-io

14
推荐指数
2
解决办法
5399
查看次数

在Stream API中使用AutoClosable接口

今天我试着重构这个代码,它从目录中的文件中读取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不能使用类似的方法.

java java-io java-8 java-stream autocloseable

14
推荐指数
1
解决办法
852
查看次数

检查输入的数字是否为奇数

`我不确定要插入什么代码甚至在哪里,但我想检查我输入的数字是一个奇数.

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)

java java-io

13
推荐指数
3
解决办法
8万
查看次数

如何为PrintWriter使用flush()

我有一些像这样的代码:

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()了吗?谢谢.

java java-io

13
推荐指数
1
解决办法
4万
查看次数

在FileReader和InputStreamReader之间进行选择

我有两种方法可以使用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)

虽然两者都给我输出......我只是想知道哪种方法最好.

java java-io

13
推荐指数
1
解决办法
2万
查看次数

Java:RandomAccessFile模式"rws"vs"rwd"?

RandomAccessFile构造函数接受一个mode字符串,指定文件应该如何打开.

我对模式"rws""rwd"模式之间的区别感到困惑.

这是文档所说的内容:

"rws"用于读写,与"rw"一样,并且还要求将文件内容或元数据的每次更新同步写入底层存储设备.

"rwd"用于读写,与"rw"一样,并且还要求将文件内容的每次更新同步写入底层存储设备.

[...]

"rwd"模式可用于减少执行的I/O操作的数量.使用"rwd"只需要将文件内容的更新写入存储; 使用"rws"需要更新文件的内容及其要写入的元数据,这通常需要至少一个低级别的I/O操作.

...并没有解释什么metadata意思.这是否意味着"rws"更新文件系统上的最后修改时间戳,而"rwd"不是?

java file-io metadata java-io

13
推荐指数
1
解决办法
1万
查看次数

如何找出用于分割行的BufferedReader#readLine()行分隔符?

我正在通过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")返回)无法使用,因为该文件可能已由另一个应用程序在另一个操作系统上写入.

java bufferedreader linefeed java-io

12
推荐指数
2
解决办法
2万
查看次数

套接字:BufferedReader readLine()块

我正在使用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方法会阻塞?服务器通常如何发出信号流结束信号?谢谢.

java sockets bufferedreader java-io

12
推荐指数
1
解决办法
2万
查看次数

InputStream,mark(),reset()

如何mark()reset()方法一步一步完成(在下面的代码中)?我试着编写自己的例子,但是开始抛出错误的标记异常或类似的东西,我无法理解在这段代码中放置标记和重置方法有什么意义,因为我看不出这个或没有区别.

import java.io.*;

class BufferedInputStreamDemo {
    public static void main(String args[]) {
        String s = "&copy; is a copyright symbol, "
                + "however &copy 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)

java java-io

12
推荐指数
2
解决办法
3万
查看次数

java.io.Buffer*流如何与普通流不同?

1)缓冲流如何在后台工作,它们与普通流有什么不同?使用它们的优点是什么?

2)DataInputStream也是以字节为基础的.但它有方法readLine().这里有什么意义?

java stream bufferedinputstream bufferedreader java-io

11
推荐指数
3
解决办法
7532
查看次数