betacode

Руководство Java OutputStream

  1. OutputStream
  2. write(int)
  3. write(byte[])
  4. write(byte[], int, int)
  5. close()
  6. flush()

1. OutputStream

OutputStream - это класс в java.io пакет, который является базовым классом, представляющим поток bytes (stream of bytes) для записи bytes в целевой объект, такой как файл.
public abstract class OutputStream implements Closeable, Flushable
В принципе, вы не можете использовать класс OutputStream напрямую, потому что это абстрактный класс. Но в конкретном случае вы можете использовать один из его подклассов.
OutputStream methods
public static OutputStream nullOutputStream()   
 
public abstract void write(int b) throws IOException
public void write(byte b[]) throws IOException  
public void write(byte b[], int off, int len) throws IOException  

public void flush() throws IOException  
public void close() throws IOException

2. write(int)

public abstract void write(int b) throws IOException
Записывать один byte в OutputStream. Параметр b - это беззнаковый код (unsigned code) byte, который представляет собой целое число от 0 до 255. Если значение b выходит за пределы указанного выше диапазона, оно будет проигнорировано.
OutputStream_write_ex1.java
package org.o7planning.outputstream.ex;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class OutputStream_write_ex1 {

    // Windows path: C:/Somedirectory/out-file.txt
    private static final String file_path = "/Volumes/Data/test/out-file.txt";

    public static void main(String[] args) throws IOException {
        File file = new File(file_path);
        // Create parent folder:
        file.getParentFile().mkdirs();

        // FileOutputStream  
        OutputStream os = new FileOutputStream(file);
       
        // 'J'
        os.write((int)'J'); // 74
        
        // 'P'
        os.write('P'); // 80 (Automatically converted to int)
        
        // '日' = 3 bytes UTF-8: [230, 151, 165]
        os.write(230);  
        os.write(151);  
        os.write(165);  
        
        // '本' = 3 bytes UTF-8: [230, 156, 172]
        os.write(230);    
        os.write(156);     
        os.write(172);     
        
        // '-'
        os.write('-');  // 45 (Automatically converted to int)
        
        // '八' = 3 bytes UTF-8: [229, 133, 171]
        os.write(229);    
        os.write(133);    
        os.write(171);    
        
        // '洲' = 3 bytes UTF-8: [230, 180, 178]
        os.write(230);  
        os.write(180);  
        os.write(178);   
        
        // Close
        os.close();
    }
}
Output:
out-file.txt
JP日本-八洲
Файлы UTF-8 используют 1, 2, 3 или 4 bytes для хранения символа. На рисунке ниже показаны bytes в созданном файле.

3. write(byte[])

public void write(byte[] b) throws IOException
Записываем массив byte в OutputStream.
OutputStream_write_ex2.java
package org.o7planning.outputstream.ex;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class OutputStream_write_ex2 {

    // Windows path: C:/Somedirectory/out-file.txt
    private static final String file_path = "/Volumes/Data/test/out-file.txt";

    public static void main(String[] args) throws IOException {
        File file = new File(file_path);
        // Create parent folder:
        file.getParentFile().mkdirs();

        // FileOutputStream
        OutputStream writer = new FileOutputStream(file);  
        
        byte[] bytes = new byte[] { 'J', 'P', //
                         (byte)230, (byte)151, (byte)165, // '日' = 3 bytes UTF-8: [230, 151, 165]
                         (byte)230, (byte)156, (byte)172, // '本' = 3 bytes UTF-8: [230, 156, 172]
                         '-', //
                         (byte)229, (byte)133, (byte)171, // '八' = 3 bytes UTF-8: [229, 133, 171]
                         (byte)230, (byte)180, (byte)178, // '洲' = 3 bytes UTF-8: [230, 180, 178]
                         };  
        
        writer.write(bytes);  
        // Close
        writer.close();
    }
}
Output:
out-file.txt
JP日本-八洲

4. write(byte[], int, int)

public void write(byte b[], int offset, int len) throws IOException
Запишем часть массива byte в OutputStream. Запись bytes из индекса offset до индекса offset+len.
OutputStream_write_ex3.java
package org.o7planning.outputstream.ex;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class OutputStream_write_ex3 {

    public static void main(String[] args) throws IOException {
        
        // ByteArrayOutputStream is a subclass of OutputStream.
        OutputStream outputStream = new ByteArrayOutputStream();  
        
        byte[] bytes = new byte[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        
        outputStream.write(bytes, 2, 5); // '2', ...'6'
        
        String s = outputStream.toString();
        System.out.println(s);
        
        outputStream.close();
    }
}
Output:
23456

5. close()

public void close() throws IOException
Метод close() используется для закрытия этого stream , сначала будет вызван метод flush(). Как только stream будет закрыт, дальнейшие вызовы write() или flush() вызовут исключение IOException. Закрытие ранее закрытого stream не имеет никакого эффекта.
public interface Closeable extends AutoCloseable
Класс Writer реализует интерфейс Closeable. Если вы пишете код в соответствии с правилами AutoCloseable, система автоматически закроет stream для вас, не вызывая метод close() напрямую.
OutputStream_close_ex1.java
package org.o7planning.outputstream.ex;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class OutputStream_close_ex1 {

    // Windows path: C:/Somedirectory/out-file.txt
    private static final String file_path = "/Volumes/Data/test/out-file.txt";

    public static void main(String[] args) throws IOException {
        File file = new File(file_path);
        // Create parent folder:
        file.getParentFile().mkdirs();

        try (OutputStream writer = new FileOutputStream(file)) {
            writer.write((int) '1');
            writer.write('2');
            writer.write((int) '3');
        }
    }
}
  • Руководство Java Closeable

6. flush()

public void flush() throws IOException
Данные, которые вы записываете в OutputStream, иногда временно сохраняются в буфере, метод flush() используется для сброса (flush) данных в целевой объект.
Вы можете прочитать статью BufferedOutputStream ниже, чтобы узнать больше о методе flush().
Если предполагаемым местом назначения этого OutputStream является абстракция, предоставляемая базовой операционной системой, например файл, то очистка stream гарантирует только то, что bytes, ранее записанные в stream, передаются в операционную систему для записи; это не гарантирует, что они действительно записаны на физическое устройство, такое как дисковод.

Руководства Java IO

Show More