精华内容
下载资源
问答
  • 前言刚接触 java 的时候很困惑一个事情 File相对...ClassLoader 用于获取class 文件 的 io,我们也可以用于获取文件的 io,以便于我们读取文件内容。本文设计内容File ,ZipFile,JarFile 读取相对路径和绝对路径...

    前言

    刚接触 java 的时候很困惑一个事情 File相对路径,以哪个目录为参照物。

    随着 io 模型的发展,java 1.7 的 nio,使用 Path、Paths 和 Files 等来方便 io 的操作。

    ClassLoader 用于获取class 文件 的 io,我们也可以用于获取文件的 io,以便于我们读取文件内容。

    本文设计内容

    File ,ZipFile,JarFile 读取相对路径和绝对路径文件内容。

    System.getProperty("user.dir”) 是怎么来的。

    Paths、Path、Files 读取文件内容。

    类加载器获取文件内容,Class.getResourceAsStream 和 ClassLoader.getResourceAsStream。

    介绍类加载器的双亲委派模型,及在代码中找到对应的加载逻辑。

    代码基于 Mac 10.15.4,JDK 1.8。

    基于 File 获取文件内容

    绝对路径的内容获取比较简单,直接获取文件 io ,然后利用工具类读取文件内容。

    获取绝对路径文件内容

    final File file = new File("/Users/zhangpanqin/github/fly-java/demo.txt");

    final byte[] bytes = cn.hutool.core.io.FileUtil.readBytes(file);

    System.out.println(new String(bytes, StandardCharsets.UTF_8));

    获取 JarFile 中的内容

    JarFile 继承 ZipFile 用于获取 jar 包中的内容。比如我想获取 jar 中的某个文件的的内容。

    final File file = new File("/Users/zhangpanqin/github/fly-java/src/main/resources/fastjson-1.2.68.jar");

    final JarFile jarFile = new JarFile(file);

    final JarEntry jarEntry = jarFile.getJarEntry("META-INF/LICENSE.txt");

    final InputStream inputStream = jarFile.getInputStream(jarEntry);

    // 工具类是 hutool

    System.out.println(IoUtil.read(inputStream, StandardCharsets.UTF_8));

    IoUtil.close(inputStream);

    获取相对路径的内容

    File.getAbsolutePath 查看源码可以发现,相对路径其实就是在前面拼接了 System.getProperty("user.dir")。

    class UnixFileSystem extends FileSystem {

    public String resolve(File f) {

    if (isAbsolute(f)) return f.getPath();

    return resolve(System.getProperty("user.dir"), f.getPath());

    }

    }

    只要我们弄清楚 System.getProperty("user.dir"),问题就迎刃而解。Java System Properties 中介绍 user.dir 是用户的工作目录。

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    什么是用户工作目录呢?就是执行 java 命令的目录。在那个目录下执行命令,usr.dir 就会被 java 虚拟机赋值为执行命令的路径。我在 /Users/zhangpanqin/github/fly-java/test 目录下运行编译的 class 文件。-cp 指定 classpath 路径。

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    nio 读取文件内容

    Path 可以类比 File 理解使用。然后工具类 Paths 可以获得 Path,Files 更是提供了丰富的 api 用于crud 操作文件 Path。

    获取绝对路径内容

    @Test

    public void run33() throws IOException {

    final Path path = Paths.get("/Users/zhangpanqin/github/fly-java/demo.txt");

    final byte[] bytes = Files.readAllBytes(path);

    System.out.println(new String(bytes,StandardCharsets.UTF_8));

    }

    获取相对路径内容

    Paths 获取相对路径时,路径不以 / 开头。也可以理解成相对于 System.getProperty("user.dir") 路径。

    public static void main(String[] args) {

    System.out.println(System.getProperty("user.dir"));

    System.out.println(Paths.get("").toAbsolutePath());

    }

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    基于 ClassLoader 获取文件内容

    ClassLoader.getResourceAsStream

    // ClassLoader.getResourceAsStream java 1.8 源码

    public InputStream getResourceAsStream(String name) {

    URL url = getResource(name);

    try {

    return url != null ? url.openStream() : null;

    } catch (IOException e) {

    return null;

    }

    }

    从代码可以看到主要逻辑还是集中在 getResource 。

    public URL getResource(String name) {

    URL url;

    if (parent != null) {

    url = parent.getResource(name);

    } else {

    url = getBootstrapResource(name);

    }

    if (url == null) {

    url = findResource(name);

    }

    return url;

    }

    以上代码的逻辑也即是我们常听到的 双亲委派机制。先让 父类加载 去加载资源,找不到再有自己找。类加载器单独讲。

    类加载器读取读取资源,先从自己负责的路径查找。比如应用类加载器 sun.misc.Launcher.AppClassLoader#AppClassLoader 负责 classpath 查找资源。类加载器读取资源相对于 File 和 Path 优势在哪里呢?比如当我想获取一个 jar 中的资源,你用路径就比较麻烦了,ClassLoader 可以从负责的路径下寻找,还可以去 jar 包中寻找。

    final URL resource = Test2.class.getClassLoader().getResource("com/alibaba/fastjson/JSONArray.class");

    System.out.println(resource);

    上述打印结果

    jar:file:/Users/zhangpanqin/.m2/repository/com/alibaba/fastjson/1.2.62/fastjson-1.2.62.jar!/com/alibaba/fastjson/JSONArray.class

    我们还可以获取一个路径的 inputstream

    @Test

    public void run222(){

    final InputStream resourceAsStream = Test2.class.getClassLoader().getResourceAsStream("META-INF/maven/com.alibaba/fastjson/pom.properties");

    System.out.println(IoUtil.read(resourceAsStream, StandardCharsets.UTF_8));

    }

    上述结果为:

    #Generated by Maven

    #Mon Oct 07 22:09:36 CST 2019

    version=1.2.62

    groupId=com.alibaba

    artifactId=fastjson

    Class.getResourceAsStream

    Class.getResourceAsStream 实际也调用的 ClassLoader 加载资源,但是它会将路径补充到相对于当前类所在包的路径。

    比如

    // com.fly.study.java.classloader.Test2

    @Test

    public void run555(){

    System.out.println(Test2.class.getResource("name"));

    }

    实际查找的资源为 com.fly.study.java.classloader.name。相对于当前类所在包的资源。

    类加载器

    我们经常会听到类加载器的 双亲委派模型。

    AAffA0nNPuCLAAAAAElFTkSuQmCC

    去哪里可以看到这些类加载呢。

    启动类加载器 不是 java 代码实现的我们看不到源码。

    sun.misc.Launcher 类中有我们知道的 扩展类加载器 sun.misc.Launcher.ExtClassLoader 和 应用类加载器 sun.misc.Launcher.AppClassLoader 。

    java.lang.ClassLoader#getSystemClassLoader 代码看的话,实际返回的应用类加载器。

    public static ClassLoader getSystemClassLoader() {

    initSystemClassLoader();

    if (scl == null) {

    return null;

    }

    SecurityManager sm = System.getSecurityManager();

    if (sm != null) {

    checkClassLoaderPermission(scl, Reflection.getCallerClass());

    }

    return scl;

    }

    private static synchronized void initSystemClassLoader() {

    if (!sclSet) {

    sun.misc.Launcher l = sun.misc.Launcher.getLauncher();

    if (l != null) {

    Throwable oops = null;

    scl = l.getClassLoader();

    }

    }

    }

    运行代码测试,返回的是应用类加载器。

    // sun.misc.Launcher$AppClassLoader@18b4aac2

    @Test

    public void run66(){

    System.out.println(ClassLoader.getSystemClassLoader());

    }

    这三个类加载器负责不同路径下的类加载。

    启动类加载器介绍

    启动类加载器 BootClassLoader 负责System.getProperty("sun.boot.class.path") 的类加载。也即是以下类。

    ${JAVA_HOME}/jre/lib/*.jar 和 ${JAVA_HOME}/jre/classes 类的加载。

    /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/resources.jar

    /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/rt.jar

    /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/sunrsasign.jar

    /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/jsse.jar

    /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/jce.jar

    /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/charsets.jar

    /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/jfr.jar

    /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/classes

    @Test

    public void run77() {

    final URLClassPath bootstrapClassPath = Launcher.getBootstrapClassPath();

    final URL[] urLs = bootstrapClassPath.getURLs();

    Stream.of(urLs).forEach(item->{

    System.out.println(item.getFile());

    });

    }

    扩展类加载器

    扩展类加载器 sun.misc.Launcher.ExtClassLoader 为加载 System.getProperty("java.ext.dirs") 中的类。

    @Test

    public void run99() {

    final String property = System.getProperty("java.ext.dirs");

    final String[] split = property.split(":");

    Stream.of(split).forEach(item -> {

    System.out.println(item);

    });

    }

    /Users/zhangpanqin/Library/Java/Extensions

    /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext

    /Library/Java/Extensions

    /Network/Library/Java/Extensions

    /System/Library/Java/Extensions

    /usr/lib/java

    应用类加载器

    应用类加载器 sun.misc.Launcher.AppClassLoader 加载 System.getProperty("java.class.path");

    # -cp 指定 classpath 路径,多个路径可以使用 : 分开(linux 下为 :,window 下为 ;),

    java -cp /Users/zhangpanqin/github/fly-java/target/classes com.fly.study.java.classloader.Test2

    本文由 张攀钦的博客 http://www.mflyyou.cn/ 创作。 可自由转载、引用,但需署名作者且注明文章出处。

    展开全文
  • java获取文件md5指纹

    2021-02-28 10:24:47
    [java]代码库public static String fileMD5(String inputFile) throws IOException {// 缓冲区大小(这个可以抽出一个参数)int bufferSize = 256 * 1024;FileInputStream fileInputStream = null;DigestInputStream ...

    [java]代码库public static String fileMD5(String inputFile) throws IOException {

    // 缓冲区大小(这个可以抽出一个参数)

    int bufferSize = 256 * 1024;

    FileInputStream fileInputStream = null;

    DigestInputStream digestInputStream = null;

    try {

    // 拿到一个MD5转换器(同样,这里可以换成SHA1)

    MessageDigest messageDigest =MessageDigest.getInstance("MD5");

    // 使用DigestInputStream

    fileInputStream = new FileInputStream(inputFile);

    digestInputStream = new DigestInputStream(fileInputStream,messageDigest);

    // read的过程中进行MD5处理,直到读完文件

    byte[] buffer =new byte[bufferSize];

    while (digestInputStream.read(buffer) > 0);

    // 获取最终的MessageDigest

    messageDigest= digestInputStream.getMessageDigest();

    // 拿到结果,也是字节数组,包含16个元素

    byte[] resultByteArray = messageDigest.digest();

    // 同样,把字节数组转换成字符串

    return byteArrayToHex(resultByteArray);

    } catch (NoSuchAlgorithmException e) {

    return null;

    } finally {

    try {

    digestInputStream.close();

    } catch (Exception e) {

    }

    try {

    fileInputStream.close();

    } catch (Exception e) {

    }

    }

    }

    //源代码片段来自云代码http://yuncode.net

    694748ed64b9390909c0d88230893790.png

    展开全文
  • Java获取文件的byte数组数据

    千次阅读 2021-03-06 05:19:41
    public static byte[] getFileByteArray(File file) {long fileSize = file.length();if (fileSize > Integer.MAX_VALUE) {System.out.println("file too big...");return null;}byte[] buffer = null;...

    public static byte[] getFileByteArray(File file) {

    long fileSize = file.length();

    if (fileSize > Integer.MAX_VALUE) {

    System.out.println("file too big...");

    return null;

    }

    byte[] buffer = null;

    try (FileInputStream fi = new FileInputStream(file)) {

    buffer = new byte[(int) fileSize];

    int offset = 0;

    int numRead = 0;

    while (offset < buffer.length

    && (numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {

    offset += numRead;

    }

    // 确保所有数据均被读取

    if (offset != buffer.length) {

    throw new IOException("Could not completely read file "

    + file.getName());

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    return buffer;

    }

    展开全文
  • 使用java 语言IO流方式获取文档里面时,由于文档的不同编码方式要采用不同的字符集 eg:如下代码,需要我们用对应文件编码去读取。 InputStreamReader isr = new InputStreamReader(new FileInputStream(file),"utf-...

    1.使用java 语言IO流方式获取文档里面时,由于文档的不同编码方式要采用不同的字符集
    eg:如下代码,需要我们用对应文件编码去读取。

       InputStreamReader isr = new InputStreamReader(new FileInputStream(file),"utf-8");//file为文件对象
       reader = new BufferedReader(isr);
       String tempString = null;
       int line = 1;
       while ((tempString = reader.readLine()) != null) { // 一次读入一行,直到读入null为文件结束
            System.out.println("line " + line + ": " + tempString);
                  //localBody=localBody+tempString+"\n";
           }
    

    吐槽:刚开始也是网上找的别人的代码,见了最多是这个代码,然并没有效果!!!
    在这里插入图片描述

    2.常用的文件编码为UTF-8、GBK、ASCII等。获取文件编码格式的java代码实现如下:(目前个人只测试并使用了UTF-8、GBK、ASCII三种可行,其他格式能否识别不确定。用到的jar包detector放在下面地址!

    try {
           bianMa=getFileCharsetName(file);//调用识别编码格式的逻辑
           System.out.println("编码格式为:"+bianMa);
         } catch (Exception e) {
            e.printStackTrace();
     }
         /** 获得文件编码
    	 * @param file
    	 * @return
          * @throws Exception
    	 */
    
       public static String getFileCharsetName(File file) throws Exception {
            CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
            detector.add(new ParsingDetector(false));
            detector.add(JChardetFacade.getInstance());
            detector.add(ASCIIDetector.getInstance());
            detector.add(UnicodeDetector.getInstance());
            Charset charset = null;
            try {
                charset = detector.detectCodepage(file.toURI().toURL());
            } catch (Exception e) {
                e.printStackTrace();
                throw e;
            }
            String charsetName = "GBK";
            if (charset != null) {
                if (charset.name().equals("US-ASCII")) {
                    charsetName = "ISO_8859_1";
                } else if (charset.name().startsWith("UTF")) {
                    charsetName = charset.name();// 例如:UTF-8,UTF-16BE.
                }else if(charset.name().equals("GB2312")){
                    charsetName="GBK";
                }
            }
            return charsetName;//返回最终的编码格式
        }	  
    

    detector包获取链接:https://pan.baidu.com/s/1fUahdV4TyWa9TQrc0ahouQ
    提取码:wj5p

    see you again!

    展开全文
  • import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileReader;import java.io.IOException;import java.io.InputStream;import java.io.Inp...
  • /*** 读取文件指定行。*/public class ReadSelectedLine {// 读取文件指定行。static void readAppointedLineNumber(File sourceFile, int lineNumber) throws IOException {FileReader in = new FileReader(source...
  • JAVA读取文件内容

    2021-03-06 20:19:14
    下面两张图片中的代码都是按行读取文件内容 上图中代码分析: 用in.readLine()一行行地读取文件file的内容 line是读取的每一行,lineI这个数组存每一行开头那个单词的首字母是整个文件的第几个字符 allLine是整个...
  • 一、认识字符编码:1、Java中String的默认编码为UTF-8,可以使用以下语句获取:Charset.defaultCharset();2、Windows操作系统下,文本文件的默认编码为ANSI,对中文Windows来说即为GBK。例如我们使用记事本程序新建...
  • package com; import java.io.File; import java.io.*; import java.io.FileInputStream; import java.io.FileReader; public class FileContent { private String path = "D:\\下载说明.txt"; ...
  • import java.io.File;import java.io.FileReader;import java.util.ArrayList;/*** Created by GQ on 6/11 0011.*/public class ParseFile {public static String path = "E:\\TEMP";//private st...
  • 一、思路首先,给出一个string表示资源文件的标识,如何判断是网络中的文件还是本地的文件?*http开头的可以看成是网络文件*其余的可看成本地文件对于mac和linux系统而言:*以 / 和 ~ 开头的表示绝对路径*其他的看做...
  • java读取文件内容为string字符串的方法发布于 2020-6-11|复制链接分享一篇关于java读取文件内容为string字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小妖过来看看吧直接就把项目中的方法贴出来...
  • public class FileModifyTest {public static void main(String[] args) {String filePath = "/Users/mac/Desktop/今日任务/1218-plan.txt";String outPath = "/Users/mac/Desktop/今日任务/1218-plan.txt";...
  • Java读取TXT文件内容的方法

    千次阅读 2021-03-06 04:26:47
    Java读取txt文件内容。可以作如下理解:首先获得一个文件句柄。File file = new File(); file即为文件句柄。两人之间连通电话网络了。接下来可以开始打电话了。通过这条线路读取甲方的信息:new FileInputStream...
  • java获取服务器文件

    2021-08-10 05:50:48
    java获取服务器文件 内容精选换一换登录Windows操作系统的弹性云服务器时,需使用密码方式登录。因此,用户需先根据创建弹性云服务器时使用的密钥文件,获取该弹性云服务器初始安装时系统生成的管理员密码...
  • java获取文件服务器地址 内容精选换一换Tomcat是一个被广泛使用的Java Web应用服务器。本文介绍了在华为云弹性云服务器上部署Java Web环境的操作步骤。首先需要下载部署Java Web环境所需的安装包,并将安装包上传至...
  • java读取文本文件内容获取文件大小:importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileReader;importjava.io.IOException;publicclassFileContent{...
  • Java读取文件内容(多个字节) package com.ycy1; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class Test02 { public ...
  • java获取文件hashcode

    2021-08-07 10:17:22
    java获取文件hashcode[2021-02-05 18:36:57]简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。...
  • 以下介绍的是在ftp上获取csv文件(类似excel文件)上的信息,并且打印出来,具体的操作会在代码的注释中说明创建接口import java.io.InputStream;import java.util.ArrayList;import org.apache.commons.net.ftp....
  • 上一篇讲了怎么properties的格式规范,这篇讲解怎么在java获取properties里面的参数 闲话不多说,直接上例子新建一个winvoi.properties文件,里面的内容时: age=152name=linkaigeid=125633相信大家已经能看懂上面...
  • linux java获取文件创建时间[2021-01-31 07:35:22]简介:服务器背景有时候我们需要获取文件的创建时间。例如:我在研究 《xtrabackup 原理图》的时候,想通过观察确认 xtrabackup_log 是最php去除nbsp的方法:首先创建...
  • Java获取文件目录(路径)的方式

    千次阅读 2021-02-12 12:56:10
    1、全部方法汇总(1)Test.class.getResource(""):获得当前生成的class的绝对路径(此方法在jar包中无效,因为他获得的是生成的class的路径,返回的内容最后包含/)(2)this.getClass().getClassLoader().getResource("...
  • Java获取File文件属性

    2021-02-12 13:43:11
    Java获取File文件属性2018-12-26File file = new File("C:\\Documents and Settings\\Administrator\\桌面","hw_net.zip");out.println("是否存在: " + file.exists());out.println("文件名: " + file.getName());...
  • Java获取文件类型的5种方法

    千次阅读 2021-02-28 19:23:05
    前言工作中经常会用到,判断一个文件文件类型,这里总结一把,一般判断文件类型的原理有2种方式:1.根据文件扩展名判断优点:速度快,代码简单缺点:无法判断出真实的文件类型,例如一些伪造的文件或者没有后缀...
  • 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文操作...
  • I tried so hard for a simple line of code that read a file content from enterprise github with oauth token, but could not find a example of such.I tried https://github.com/jcabi/jcabi-github, but it d...
  • 有时候,我们需要确定某些文件是否有变化而做出一些对应的动作,例如,曾经开发的一款服务器中,由于模块比较多,在运行期间有时候需要单独的输出某个模块日志,但又不可能总是开着日志。log4j中已经实现了可以动态...
  • 常用文件文件头如下: JPEG (jpg),文件头:FFD8FF PNG (png),文件头:89504E47 GIF (gif),文件头:47494638 TIFF (tif),文件头:49492A00 Windows Bitmap (bmp),文件头:424D CAD (dwg),文件头:41433130 ...
  • 获取Java文件路径

    2021-02-26 12:54:48
    1.如何获得当前文件路径常用:字符串类型:System.getProperty("user.dir");综合:package com.zcjl.test.base;import java.io.File;public class Test {public static void main(String[] args) throws Exception {...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 781,814
精华内容 312,725
关键字:

java怎么获取文件的内容

java 订阅