精华内容
下载资源
问答
  • I need to read a text file line by line using Java. I use available() method of FileInputStream to check and loop over the file. But while reading, the loop terminates after the line before the last o...

    I need to read a text file line by line using Java. I use available() method of FileInputStream to check and loop over the file. But while reading, the loop terminates after the line before the last one. i.e., if the file has 10 lines, the loop reads only the first 9 lines.

    Snippet used :

    while(fis.available() > 0)

    {

    char c = (char)fis.read();

    .....

    .....

    }

    解决方案

    You should not use available(). It gives no guarantees what so ever. From the API docs of available():

    Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream.

    You would probably want to use something like

    try {

    BufferedReader in = new BufferedReader(new FileReader("infilename"));

    String str;

    while ((str = in.readLine()) != null)

    process(str);

    in.close();

    } catch (IOException e) {

    }

    展开全文
  • Java输入输出

    2016-01-21 21:53:52
    available方法使我们可以去检查当前可读入的字节数量。当你完成对流的读写时,应该通过调用close方法来关闭它,否则可能写出字节的最后一个包永远也得不到传递,当然也可以用flush方法来人为地冲刷这些输出。if(is....

    read & write方法

    read和write方法在执行时都将阻塞,直至字节确实被读入或写出。available方法使我们可以去检查当前可读入的字节数量。当你完成对流的读写时,应该通过调用close方法来关闭它,否则可能写出字节的最后一个包永远也得不到传递,当然也可以用flush方法来人为地冲刷这些输出。

    if(is.available()>0){
        ...
        is.read(buffer);
        ...
    }

    注意:
    1. read和write方法一次只读取写入一个字节。
    2. 所有在java.io中的类都相对路径名解释为以用户工作目录开始,可以通过调用System.getProperty(“user.dir”)来获得这个信息
    3. 由于反斜杠字符在Java中是转义字符,因此要确保在windows风格的相对路径名中使用\,也可以使用单斜杆字符/。因为大部分文件处理的系统调用都会将反斜杠解释成文件分割符。但最好使用java.io.File.separator获得系统文件分割符。

    Stream

    与抽象类InputStream和OutputStream一样,这些类只支持在字节级别上的读写。使用DataInputStream可以读入数值类型,如:

    DataInputStream din = ...;
    double s = din.readDouble();

    回推流:当读入输入时,经常需要浏览下一个字节,以了解它是否是你想要的值,Java提供了用于此目的的PushbackInputStream:

    PushBackInputStream pbin = ...;
    // 预读下一个字节
    int b = pbin.read();
    // 在它并非你说期望的值时将其推回流中
    if(b != '<') pbin.unread(b);

    FileOutputStream(File file, boolean append) 重载方法:append决定是否以增加模式写入文件

    文本输入输出

    整数1234储存成二进制数时,它被写成为由字节码00 00 04 D2构成的序列(16进制表示法)。

    1. 字节: 用某种字符编码方式表示的字符
    2. InputStreamReader将包含字节的输入流转换为可以产生Unicode码元的读入器

    对于文本输出,可以使用PrintWriter简便方法:

    PrintWriter out = new PrintWriter("d:\\data.txt");
    String name = "Hello World!";
    out.println(name);  // name将被写入到txt文件中

    调用println()不会自动刷新
    可以使用PrintWriter(Writer out, Boolean autoFlush)来启用自动刷新

    BufferReader 没有任何用于读入数值的方法,可以使用Scanner来读入文本输入。
    DataOutputStream.writeUTF(String s): 写出由“修订过的UTF-8”格式的字符构成的字符串。

    对象流与序列化

    为了保存对象,可以使用ObjectOutputStream的writeObject方法写入对象。读回对象需要获得一个ObjectInputStream对象,然后调用readObject方法顺序读回它们,如:

    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("employee.dat"));
    Manager boss = bew Manager("Carl", 8000, 1987, 12, 15);
    out.writeObject(boss);
    
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("employee.dat"));
    Employee e = (Employee) in.readObject();

    但是,对希望在对象流中储存或恢复的所有类都应进行一下修改,这些类必须实现Serializable接口,然而,Serializable接口中没有任何方法,因此不需要对这些类做任何改动。

    1. 对象序列化是以特殊的文件格式储存对象数据的,当然,由于良好的封装性,我们需要了解文件中表示对象的确切字节序列,就可以使用writeObject/readObject方法。
    2. 安全散列算法(SHA)是一种可以为较大的信息块提供指纹的快速算法,不论最初的数据块尺寸有多大,这种指纹总是20个字节的数据包。
    3. 对象流输出中包含所有的类型和数据域。每个对象都被赋予一个序列号。相同对象的重复出现将被储存为对这个对象的序列号的引用。

    transient关键字: 不可被序列化的数据域,仅加入关键字不够,还需要调用out.defaultWriteObject()来写入描述信息,再写入其它数据,如:

    out.defaultWriteObject();
    out.writeDouble(point.getX());
    out.writeDouble(point.getY());

    枚举的默认序列化是不适用的,在它储存后被读取,会被创建为一个全新的对象!
    其它情况下,序列化可作为深度克隆对象。


    2016年1月21日续

    文件操作

    Path p = Paths.get("\home", "dir", "test");

    静态的Paths.get方法接受一个或多个字符串,并将它们用默认的文件系统的路径分隔符连接起来。

    有时需要与遗留系统的API交互,它们使用的是File类而不是Path类。Path类有一个toFile方法,而File类也有一个toPath方法。

    文件复制、移动操作:

    Files.copy(fromPath, toPath);   //复制文件
    Files.move(fromPath, toPath);   //移动文件 可附加StandardCopyOption.REPLACE_EXISITING选项

    迭代文件:

    DirectoryStream<Path> entries = Files.newDirectoryStream(dir);
    for(Path entry : entries) {
        ...
    }

    Glob模式:用于过滤文件,如”*.java”

    文件加锁机制:

    FileChannel channel = FileChannel.open(path);
    FileLock lock = channel.lock();     //阻塞式方法
    FileLock lock = channel.tryLock();  //调用立即返回,不可获得锁则返回null
    lock.release();                     //解锁
    展开全文
  • Java BufferedInputStream available()方法java.io.BufferedInputStream.available()方法返回的字节数仍然为从输入流中可通过此输入流的方法的下一次调用阻挡读取。1 语法public int available()2 参数无3 返回值...

    Java BufferedInputStream available()方法

    java.io.BufferedInputStream.available() 方法返回的字节数仍然为从输入流中可通过此输入流的方法的下一次调用阻挡读取。

    1 语法

    public int available()

    2 参数

    3 返回值

    返回从该输入流读取的剩余字节数,而不会阻塞。

    4 示例

    package com.yiidian;

    /**

    * 一点教程网: http://www.yiidian.com

    */

    /**

    * java.io.BufferedInputStream.available()方法的例子

    */

    import java.io.BufferedInputStream;

    import java.io.FileInputStream;

    public class Demo {

    public static void main(String[] args) throws Exception {

    BufferedInputStream bis = null;

    FileInputStream inStream = null;

    try {

    // open input stream test.txt for reading purpose.

    inStream = new FileInputStream("d:/test.txt");

    // input stream is converted to buffered input stream

    bis = new BufferedInputStream(inStream);

    // read until a single byte is available

    while( bis.available() > 0 ) {

    // get the number of bytes available

    Integer nBytes = bis.available();

    System.out.println("Available bytes = " + nBytes );

    // read next available character

    char ch = (char)bis.read();

    // print the read character.

    System.out.println("The character read = " + ch );

    }

    } catch(Exception e) {

    e.printStackTrace();

    } finally {

    // releases any system resources associated with the stream

    if(inStream!=null)

    inStream.close();

    if(bis!=null)

    bis.close();

    }

    }

    }

    假设test.txt内容如下:

    ABCDE

    输出结果为:

    Available bytes = 5

    The character read = A

    Available bytes = 4

    The character read = B

    Available bytes = 3

    The character read = C

    Available bytes = 2

    The character read = D

    Available bytes = 1

    The character read = E

    展开全文
  • 在文件流读取完之后会定位到末端,则无法再用该输入流读取数据。若用read()方法则返回-1,若你调用available()方法返回0,若要重新读取,则要用到mark和reset方法。若要重新从0开头开始读取,则要在读取输入流之前用...
    1. 在文件流读取完之后会定位到末端,则无法再用该输入流读取数据。若用read()方法则返回-1,若你调用available()方法返回0,若要重新读取,则要用到mark和reset方法。若要重新从0开头开始读取,则要在读取输入流之前用mark方法,参数readlimit由自己定义。若在读取了第n个字节后调用mark方法,在输入流读取完之后,调用reset则从新重第n个字节开始读取。  
    2. public void mark(int readlimit)  
    3.         在此输入流中标记当前的位置。对 reset 方法的后续调用会在最后标记的位置重新定位此流,以便后续读取重新读取相同的字节。   
    4.         readlimit 参数告知此输入流在标记位置失效之前允许读取的字节数。   
    5.         mark 的常规协定是:如果方法 markSupported 返回 true,那么输入流总是在调用 mark 之后记录所有读取的字节,并时刻准备在调用方法 reset 时(无论何时),再次提供这些相同的字节。但是,如果在调用 reset 之前可以从流中读取多于 readlimit 的字节,则不需要该流记录任何数据。如果在mark之后读取的数据的大小大于 readlimit和BufferedInputStream类的缓冲区大小两者中的最大值则mark标记无效。   
    6.         标记已关闭的流对其无效。   
    7.         InputStream 的 mark 方法不执行任何操作。   
    8. 参数:  
    9.         readlimit - 在标记位置失效前可以读取字节的最大限制。  
    10. 注意:mark和reset方法只能在BufferedInputStream中使用,BufferedInputStream类调用mark(int readlimit)方法后读取多少字节标记才失效,是取readlimit和BufferedInputStream类的缓冲区大小两者中的最大值,而并非完全由readlimit确定。这个在JAVA文档中是没有提到的。  
    11. 例子:  
    12. public PreviewImage(InputStream reader2,OutputStream os)throws IOException{  
    13.        BufferedInputStream reader = new BufferedInputStream(reader2);  
    14.        byte[]  b  =  new  byte[1024  *  5];   //输出流的缓冲区 5kb  
    15.        int  len;   
    16.        reader.mark(reader.available()+1);  
    17.        while  ( (len  =  reader.read(b))  !=  -1)  {   
    18.           //os.write(b, 0, len);    
    19.        }    
    20.        reader.reset();  
    21.        while  ( (len  =  reader.read(b))  !=  -1)  {   
    22.           os.write(b, 0, len);    
    23.        }    
    24.        os.flush();   
    25.        os.close();  
    26.    }  
    展开全文
  • 1. 字节输入流: 1.1 InputStream类的常用方法 1. available() 方法,获取与之关联的文件剩余可读的字节数。 2. int read() 方法,读取输入流。读取输入流的下一个字节,返回一个0-255之间的int类型整数。如果到达流...
  • (1)一般的java代码 @Test public void whenConvertingToFile_thenCorrect() throws IOException { InputStream initialStream = new FileInputStream( new File("src/main/resources/sample.txt")); byte[]...
  • 从下一次调用此输入流的方法返回可从该输入流读取(或跳过)的字节数,而不会阻塞。 void close​() 关闭此输入流并释放与流相关联的任何系统资源。 void mark​(intreadlim..
  • 输入流 InputStream类 int read() void close() int available() skip(long n) boolean markSupported(),void mark(int readLimit),void reset() FileStream类(InputStream的子类) 读文件 package tupnimaerts; ...
  • javaIO 输入输出

    2010-11-17 21:21:02
    //创建输入流 File file = new File("src/R1L24S@4(}WW6%_H[%326WP.jpg"); InputStream is = new FileInputStream(file); byte bt[] = new byte[is.available()]; is.read(bt, 0, bt.length); //创建...
  • Java ByteArrayInputStream available()方法java.io.ByteArrayInputStream.available()用于返回可从输入流读取的剩余字节数。1 语法public int available()2 参数无3 返回值该值返回要从输入流读取的字节数。4 示例...
  • packagecom.javaSe.FileInputStream;importjava.io.FileInputStream;importjava.io..../*FileInputStream类的其他常用方法:int available():返回当中剩余的没有读到的字节数量。long skip(long...
  • 1、将File、FileInputStream 转换为byte数组:File file = new File("test.txt");InputStream input = new ...byte[] byt = new byte[input.available()];input.read(byt);2、将byte数组转换为InputStream:byte[]...
  • 一、InputStream 所有输入字节的父抽象类,包括read(),skip(),available(),close(),mark(),reset()等方法二、FileInputStream 正常的文件输入字节,每调用一次read(),读取一个字节三、...
  • 唯一看起来有点可疑的是将输入流实例提供给SerialReader的部分.我建议您将SerialPort实例传递给两个构造函数,并且每次需要读取/写入端口的流时,请使用流getter,例如阅读:public static class SerialReader ...
  • Java文件

    2017-05-09 17:28:40
    字节流 ...返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。  void close()  关闭此输入流并释放与该流关联的所有系统资源。  void mark(int readl
  • Java FileInputStream available()方法java.io.FilterInputStream.available()用于返回可以从输入流读取的估计字节数。1 语法public int available()2 参数无3 返回值返回可以读取的字节数的估计值。4 示例package ...
  • 1. InputStream 和OutputStream  ... available():返回中可用字节数  mark():在中标记一个位置  reset():返回标记过得位置  markSupport():是否支持标记和复位操作  close():关闭  int r
  • 收集通信更安闲 谈java串行端口技巧协定.doc还剩9页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,喜欢就下载吧,价低环保!内容要点:case SerialPortEvent.DATA_AVAILABLE :System.out.println("DATA_...
  • BufferedInputStream类将新属性添加到其他输入流,从而可以缓冲输入。创建BufferedInputStream时,将创建一个内部缓冲区数组。BufferedInputStream类的available()方法用于知道可从内部缓冲区阵列读取的字节数,直到...
  • 全屏java.io.BufferedInputStream.available()方法返回从输入流中读取不受阻塞,输入流方法的下一次调用的剩余字节数。声明以下是java.io.BufferedInputStream.available()方法的声明publicintavailable()返回值此...
  • 1、FilterInputStream(过滤器输入流) 1.1 字段 protected InputStream in //要过滤的输入流。...int available() //返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被此输入流的方法的下一个调用方
  • Java IO02_字节

    2019-07-25 22:45:46
    所有面向字节的流类都继承于InputStream类(输入流)或OutputStream类(输出流),这两个类是抽象类,我们可以利用它的子类来完成不同的功能。 InputStream 方法 描述 int available() 返回可...
  • Java IO

    2012-01-10 07:28:51
    流的分类:1)数据方向:输入流与输出流 ...输入流:inputstream,所有字节输入流的父类,几个通用的方法:int read(),int read(byte[]),int read(byte[],int,int),void close(),int available(),void skip
  • java 怎么判断一个输入流是否数据了

    千次阅读 2019-11-20 15:35:07
    InputStream in= sock.getInputStream(); if(in.available()!=0){ //读取操作 } 来源
  • java.util.zip.DeflaterInputStream.available()方法在EOF达到后返回0,否则返回1。...public int available()throws IOException返回值在到达底层输入流结束后为0,否则始终返回1。例以下示例显示了java.ut...
  • 1、ObjectInputStream(对象输入流) 1.1 构造方法 protected ObjectInputStream() //为完全重新实现ObjectInputStream的子类提供一种方法,以便不必分配此ObjectInputStream实现刚刚使用的私有数据。 ...
  • Java IO

    2015-05-30 09:03:54
    Java IO流:读出一系列字节的对象:输入流; 写入一系列字节的对象:输出流; InputStream类: 读取方式: read; read(byte []b); read(byte []b,int off,inr len ); //off:起始偏移,len:字节数 其它...
  • 这个原理是这样的,输入流读取文件到一个字节数组中,然后输出流把这个字节数组的数据写入到文件。1.代码演示 还是模拟上一篇的一个比较小的mp4的文件拷贝。下面代码中available是一个获取字节长度的方法,...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 141
精华内容 56
关键字:

java输入流available

java 订阅