File I/O source code--新建文件 相关方法阅读

2024-06-21 10:18

本文主要是介绍File I/O source code--新建文件 相关方法阅读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

虽然我们经常在用java的I/O,但是我们有没有想过,我们是怎样来创建文件的呢

首先我们来新建一个文件:

try {File file = new File("c:\\newfile.txt");if (file.createNewFile()){System.out.println("File is created!");}else{System.out.println("File already exists.");}} catch (Exception e) {e.printStackTrace();}

我们的目的是在c盘根目录新建一个名称为newfile.txt的文件,我们看看File的构造方法是如何写的呢

/*** Creates a new <code>File</code> instance by converting the given* pathname string into an abstract pathname.  If the given string is* the empty string, then the result is the empty abstract pathname.** @param   pathname  A pathname string* @throws  NullPointerException*          If the <code>pathname</code> argument is <code>null</code>*/public File(String pathname) {if (pathname == null) {throw new NullPointerException();}this.path = fs.normalize(pathname);this.prefixLength = fs.prefixLength(this.path);}

这里的fs对象是这么来的

/*** The FileSystem object representing the platform's local file system.*/static private FileSystem fs = FileSystem.getFileSystem();

然后我们进入FileSystem类中发现,normalize(...)为抽象方法:

 /*** Convert the given pathname string to normal form.  If the string is* already in normal form then it is simply returned.*/public abstract String normalize(String path);

所以我们可以看出,一定有相关的实现方法,我找了很久发现他有三个子类分别为:    UnixFileSystem WinNTFileSystem Win32FileSystem

我们先看UnixFileSystem 中是如何实现的

/* A normal Unix pathname contains no duplicate slashes and does not end59          with a slash.  It may be the empty string. */60   61       /* Normalize the given pathname, whose length is len, starting at the given62          offset; everything before this offset is already normal. */63       private String normalize(String pathname, int len, int off) {64           if (len == 0) return pathname;65           int n = len;66           while ((n > 0) && (pathname.charAt(n - 1) == '/')) n--;67           if (n == 0) return "/";68           StringBuffer sb = new StringBuffer(pathname.length());69           if (off > 0) sb.append(pathname.substring(0, off));70           char prevChar = 0;71           for (int i = off; i < n; i++) {72               char c = pathname.charAt(i);73               if ((prevChar == '/') && (c == '/')) continue;74               sb.append(c);75               prevChar = c;76           }77           return sb.toString();78       }79   80       /* Check that the given pathname is normal.  If not, invoke the real81          normalizer on the part of the pathname that requires normalization.82          This way we iterate through the whole pathname string only once. */83       public String normalize(String pathname) {84           int n = pathname.length();85           char prevChar = 0;86           for (int i = 0; i < n; i++) {87               char c = pathname.charAt(i);88               if ((prevChar == '/') && (c == '/'))89                   return normalize(pathname, n, i - 1);90               prevChar = c;91           }92           if (prevChar == '/') return normalize(pathname, n, n - 1);93           return pathname;94       }

大致的意思就是判断字符串中是否含有‘/’符号(是否是相对路径),如果pathname中包含有多个反斜杠(/),根据源码分析最终得出的只会返回一个反斜杠

我们接着往下看:

/*** Compute the length of this pathname string's prefix.  The pathname* string must be in normal form.*/public abstract int prefixLength(String path);

它的实现方法是:

public int prefixLength(String pathname) {if (pathname.length() == 0)return 0;return (pathname.charAt(0) == '/') ? 1 : 0;}

这个看完之后我们再来看看它到底是如何来创建文件的呢

/*** Atomically creates a new, empty file named by this abstract pathname if* and only if a file with this name does not yet exist.  The check for the* existence of the file and the creation of the file if it does not exist* are a single operation that is atomic with respect to all other* filesystem activities that might affect the file.* <P>* Note: this method should <i>not</i> be used for file-locking, as* the resulting protocol cannot be made to work reliably. The* {@link java.nio.channels.FileLock FileLock}* facility should be used instead.** @return  <code>true</code> if the named file does not exist and was*          successfully created; <code>false</code> if the named file*          already exists** @throws  IOException*          If an I/O error occurred** @throws  SecurityException*          If a security manager exists and its <code>{@link*          java.lang.SecurityManager#checkWrite(java.lang.String)}</code>*          method denies write access to the file** @since 1.2*/public boolean createNewFile() throws IOException {SecurityManager security = System.getSecurityManager();if (security != null) security.checkWrite(path);return fs.createFileExclusively(path);}

这里关键是fs.createFileExclusively(path),进去看了之后发现它是一个抽象方法

我们看下这里的描述Return ture if the file was created and false if a file or directory with the given pathname already exists。

它的意思是如果文件创建成功则返回true,如果文件或路径已经创建则返回false

/*** Create a new empty file with the given pathname.  Return* <code>true</code> if the file was created and <code>false</code> if a* file or directory with the given pathname already exists.  Throw an* IOException if an I/O error occurs.*/public abstract boolean createFileExclusively(String pathname)throws IOException;

实现类中方法却是本地方法

public native boolean createFileExclusively(String path)throws IOException;

那什么是java native方法呢?

英文不太好,看了半天没搞球太明白,后来看到一篇中文的描述感觉挺好的,所以这里感谢分享的朋友

详细连接:java Native Method初涉




这篇关于File I/O source code--新建文件 相关方法阅读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080949

相关文章

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

Python中使用defaultdict和Counter的方法

《Python中使用defaultdict和Counter的方法》本文深入探讨了Python中的两个强大工具——defaultdict和Counter,并详细介绍了它们的工作原理、应用场景以及在实际编... 目录引言defaultdict的深入应用什么是defaultdictdefaultdict的工作原理

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统