Flux d'E/S Java (1) Bases d'E/S

Aperçu

L'essence du flux IO
  • E/S signifie Entrée/Sortie, c'est-à-dire entrée/sortie pendant la transmission de données, et l'entrée et la sortie sont relatives à la mémoire.
  • Les flux Java IO (entrée/sortie) sont le composant clé utilisé par Java pour gérer la lecture et l'écriture des données.
  • Les supports d'E/S courants incluent
    • Fichier ( entrée|sortie )
    • réseau ( entrée|sortie )
    • Clavier ( sortie )
    • Affichage ( sortie )
  • scènes à utiliser
    • Copie de fichier (Fichier)
    • Téléchargement et téléchargement de fichiers
    • Importation et exportation Excel
    • Transmission de données dans les programmes réseau (outils de chat)

Classification

Aperçu

Presque toutes les opérations d'E/S en Java nécessitent l'utilisation du package java.io ; les flux peuvent être classés comme suit

  • Divisé par sens de flux (les processus d'entrée et de sortie sont généralement considérés du point de vue du programme)
    • Flux d'entrée (Entrée)
    • Sortir
  • Selon le type de traitement du flux
    • Flux d'octets (octet) : l'octet est l'unité de base de la capacité de stockage de l'ordinateur (octet), 1B = 8b, occupe 8 bits en binaire
    • Flux de caractères (char) : le caractère est le nom collectif du texte ou des symboles

        Remarque : Le flux d'octets peut lire tout type de fichier, tel que les fichiers de type binaire (images, vidéos, audios, fichiers compressés, etc.), tandis que le flux de caractères est utilisé pour lire les fichiers de type texte.

  • Selon la fonction du flux
    • Flux de nœuds (interagir directement avec les sources d'entrée et de sortie)
    • Flux de traitement (flux qui encapsulent d'autres flux : flux d'encapsulation)

Flux d'octets (InputStream && OutputStream)

Diagramme de classes InputStream
Diagramme de classes OutputStream

Flux d'octets couramment utilisés dans les processus de développement quotidiens :

FileInputStream && FileOutputStream : couramment utilisé pour implémenter la copie/copie de fichiers
BufferedInputStream && BufferedOutputStream : afin de réduire le nombre de fois d'E/S et d'améliorer l'efficacité de la lecture
PrintStream : dérivé de OutputStream, flux de sortie d'impression d'octets standard (principe d'implémentation du framework de log)
ZipOutputStream && ZipInputStream : utilisé pour la compression/décompression de fichiers

Flux de caractères (lecteur et écrivain)

Diagramme de classe de lecteur
Diagramme de classes d'écrivain

Flux de caractères couramment utilisés dans les processus de développement quotidiens :

FileReader&&FileWriter:作用同FileInputStream && FileOutputStream
BufferedReader&&BufferedWriter : La fonction est la même que BufferedInputStream && BufferedOutputStream. En même temps, BufferedReader fournit une méthode de lecture de texte ligne par ligne pour faciliter le traitement du texte.
Extension : Nous savons que les flux d'octets peuvent lire n'importe quel fichier, pourquoi devons-nous concevoir un flux de caractères ?
  • Pour les fichiers de caractères, transférez-les d'abord sous forme d'octets -> puis convertissez-les en caractères, ce qui prend plus de temps.
  • Pour les fichiers de caractères, si le texte est chinois, il sera facilement tronqué.

Modèles de conception

Divers modèles de conception sont utilisés dans les flux d'E/S, notamment les suivants :

mode adaptateur

Le modèle Adapter permet à des classes de travailler ensemble qui autrement ne fonctionneraient pas ensemble en raison d'interfaces incompatibles .

Afin de réaliser la conversion mutuelle entre le flux de caractères et le flux d'octets dans Java IO, deux classes d'adaptateurs sont conçues.

InputStreamReader et OutputStreamWriter

InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName), "UTF-8");
BufferedReader bufferedReader = new BufferedReader(isr);

Modèle de décorateur

Le modèle de décorateur peut attacher dynamiquement de nouvelles fonctionnalités à des objets existants sans modifier la fonctionnalité des objets existants. La sous-classe FilterInputStream d'InputStream, la sous-classe FilterOutputStream d'OutputStream, les sous-classes de Reader BufferedReader et FilterReader et les sous-classes de Writer BufferedWriter, FilterWriter et PrintWriter, etc., sont toutes des classes décoratives abstraites. Fonctionnalité améliorée des objets de sous-classe.

pratique

ZipOutputStream&&FileOutputStream&&FileInputStream implémente la compression de fichiers

/**
 * 功能: 通过ZipOutputStream压缩文件,最后返回压缩包
 * @param files
 * @param fileName
 * @return
 */
public File zipFiles(File[] files,String fileName) {
    File zipFile = null;
    FileOutputStream fosZipFile = null;
    ZipOutputStream zosZipFile = null; //压缩文件输出流
    try {
        zipFile = downloadAttachmentService.createFile("", fileName); //创建一个空的文件目录
        fosZipFile = new FileOutputStream(zipFile); //以文件流从内存中输出
        zosZipFile = new ZipOutputStream(fosZipFile); //以压缩流从内存中输出

        for (File file : files) {
            FileInputStream fis = new FileInputStream(file); //对每个文件创建输入流,读取文件到内存
            ZipEntry zipEntry = new ZipEntry(file.getName()); //ZipEntry用来创建压缩文件
            zosZipFile.putNextEntry(zipEntry); //加入需要压缩的文件

            byte[] bytes = new byte[1024];
            int length;
            while((length = fis.read(bytes)) >= 0) { //读取文件到内存
                zosZipFile.write(bytes, 0, length); //文件写入压缩流
            }
            fis.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally { //关闭流
        try {
            zosZipFile.close();
            fosZipFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return zipFile; //返回压缩包
}
/**
 * @Title: createFile
 * @Description: 创建下载目录文件
 * @author Bierce
 * @param rootPath
 * @param filename
 * @return
 * @throws IOException
 */
public File createFile(String rootPath, String filename) throws IOException {
    // Default root path
    if (rootPath.isEmpty()) {
        rootPath = "download-cache";
    }
    File fRoot = new File(rootPath);
    if (!fRoot.exists() || !fRoot.isDirectory()) {
        fRoot.mkdirs();
    }
    // job sub path
    String uuid = UUID.randomUUID().toString();
    String directoryJob = rootPath + File.separator + getClass().getSimpleName() + File.separator + uuid;//文件名称随机生成保证唯一
    File dirJob = new File(directoryJob);
    if (!dirJob.exists() || !dirJob.isDirectory()) {
        dirJob.mkdirs();
    }
    String filePath = directoryJob + File.separator + filename;
    File file = new File(filePath);
    if (!file.exists()) {
        file.createNewFile();
    }
    return file;
}
//-----------------扩展方法-文件名去重保证唯一-----------------
/**
 * @Title: snFileName_noUIID
 * @Description: 去除sn文件UUID以及解决sn文件名重复问题
 * @author Bierce
 * @return file
 */
public File snFileName_noUIID(String fileParentPath,String snFileName,File file){
    //snFileName:完整文件名 sn-xx..UUID..xx.xlsx
    //snFileName_delUIID: sn.xlsx
    //snFileName_prefix: sn
    //suffix:xlsx
    //文件名:如sn.xlsx
    String snFileName_delUIID = snFileName.substring(0,snFileName.length() - 42) + ".xlsx";//42是固定长度:UUID+.xlsx
    String snFileName_prefix = snFileName.substring(0,snFileName.length() - 42);//文件前缀
    String suffix = snFileName.substring(snFileName.lastIndexOf("."));//文件后缀:.xlsx

    try {
        file = new File(fileParentPath + snFileName_delUIID);//设置sn文件所在目录为计划交接文件目录下
        int i = 1;
        //对于同名SN文件情况重新命名
        while(file.exists()) {//保证文件夹下不存在同名文件
            String newFileName = snFileName_prefix + "(" + i + ")" + suffix;
            String parentPath = file.getParent();
            file = new File(parentPath + File.separator + newFileName);
            i++;
        }
        file.createNewFile();//new File 只是创建了一个File对象,还需要调用createNewFile()方法才能实现文件的成功创建
    } catch (Exception e) {
    }
    return file;
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_34020761/article/details/132337756
conseillé
Classement