javac编译后文件内容变化

Python012

javac编译后文件内容变化,第1张

当使用javac编译器编译Java源代码时,会产生一个字节文件,它包含了Java虚拟机(JVM)可以理解的指令。字节码文件的内容是由Java源代码编译而来的,它们是由一系列指令组成的,这些指令描述了Java虚拟机如何执行Java程序。字节码文件的内容可以被用来描述Java程序的行为,这些指令可以用来控制Java程序的执行,以及它们如何处理数据。字节码文件还可以包含元数据,这些元数据可以用来描述Java程序的结构,以及它们如何与其他程序交互。字节码文件的内容可以被用来描述Java程序的行为,这些指令可以用来控制Java程序的执行,以及它们如何处理数据。字节码文件还可以包含元数据,这些元数据可以用来描述Java程序的结构,以及它们如何与其他程序交互。此外,字节码文件还可以包含一些额外的信息,例如类型信息,变量名称和方法名称等。总之,字节码文件的内容可以用来描述Java程序的行为,以及它们如何处理数据和与其他程序交互。

JavaSE 1.7提供了相关的API,去监视文件或者文件夹的变动,主要的API都在java.nio.file下面,其大概流程如下:

package org.xdemo.superutil.j2se.filewatch

 

import static java.nio.file.LinkOption.NOFOLLOW_LINKS

 

import java.io.File

import java.io.IOException

import java.nio.file.FileSystems

import java.nio.file.FileVisitResult

import java.nio.file.Files

import java.nio.file.Path

import java.nio.file.Paths

import java.nio.file.SimpleFileVisitor

import java.nio.file.StandardWatchEventKinds

import java.nio.file.WatchEvent

import java.nio.file.WatchEvent.Kind

import java.nio.file.WatchKey

import java.nio.file.WatchService

import java.nio.file.attribute.BasicFileAttributes

import java.util.HashMap

import java.util.Map

 

/**

 * 文件夹监控

 * 

 * @author Goofy <a href="http://www.xdemo.org/">http://www.xdemo.org/</a>

 * @Date 2015年7月3日 上午9:21:33

 */

public class WatchDir {

 

    private final WatchService watcher

    private final Map<WatchKey, Path> keys

    private final boolean subDir

 

    /**

     * 构造方法

     * 

     * @param file

     *            文件目录,不可以是文件

     * @param subDir

     * @throws Exception

     */

    public WatchDir(File file, boolean subDir, FileActionCallback callback) throws Exception {

        if (!file.isDirectory())

            throw new Exception(file.getAbsolutePath() + "is not a directory!")

 

        this.watcher = FileSystems.getDefault().newWatchService()

        this.keys = new HashMap<WatchKey, Path>()

        this.subDir = subDir

 

        Path dir = Paths.get(file.getAbsolutePath())

 

        if (subDir) {

            registerAll(dir)

        } else {

            register(dir)

        }

        processEvents(callback)

    }

 

    @SuppressWarnings("unchecked")

    static <T> WatchEvent<T> cast(WatchEvent<?> event) {

        return (WatchEvent<T>) event

    }

 

    /**

     * 观察指定的目录

     * 

     * @param dir

     * @throws IOException

     */

    private void register(Path dir) throws IOException {

        WatchKey key = dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY)

        keys.put(key, dir)

    }

 

    /**

     * 观察指定的目录,并且包括子目录

     */

    private void registerAll(final Path start) throws IOException {

        Files.walkFileTree(start, new SimpleFileVisitor<Path>() {

            @Override

            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {

                register(dir)

                return FileVisitResult.CONTINUE

            }

        })

    }

 

    /**

     * 发生文件变化的回调函数

     */

    @SuppressWarnings("rawtypes")

    void processEvents(FileActionCallback callback) {

        for () {

            WatchKey key

            try {

                key = watcher.take()

            } catch (InterruptedException x) {

                return

            }

            Path dir = keys.get(key)

            if (dir == null) {

                System.err.println("操作未识别")

                continue

            }

 

            for (WatchEvent<?> event : key.pollEvents()) {

                Kind kind = event.kind()

 

                // 事件可能丢失或遗弃

                if (kind == StandardWatchEventKinds.OVERFLOW) {

                    continue

                }

 

                // 目录内的变化可能是文件或者目录

                WatchEvent<Path> ev = cast(event)

                Path name = ev.context()

                Path child = dir.resolve(name)

                File file = child.toFile()

                if (kind.name().equals(FileAction.DELETE.getValue())) {

                    callback.delete(file)

                } else if (kind.name().equals(FileAction.CREATE.getValue())) {

                    callback.create(file)

                } else if (kind.name().equals(FileAction.MODIFY.getValue())) {

                    callback.modify(file)

                } else {

                    continue

                }

 

                // if directory is created, and watching recursively, then

                // register it and its sub-directories

                if (subDir && (kind == StandardWatchEventKinds.ENTRY_CREATE)) {

                    try {

                        if (Files.isDirectory(child, NOFOLLOW_LINKS)) {

                            registerAll(child)

                        }

                    } catch (IOException x) {

                        // ignore to keep sample readbale

                    }

                }

            }

 

            boolean valid = key.reset()

            if (!valid) {

                // 移除不可访问的目录

                // 因为有可能目录被移除,就会无法访问

                keys.remove(key)

                // 如果待监控的目录都不存在了,就中断执行

                if (keys.isEmpty()) {

                    break

                }

            }

        }

    }

 

}

原因:执行环境中的JRE版本与被执行代码的class文件不兼容,一本是因为编译Java代码时使用的JRE版本比代码运行环境的JRE版本要高。我们所遇到的问题正式这样,有的同学的Mac机上模式使用的Java 7,而远程Linux服务器上我们是默认使用Java 6.

Java版本的主版本号如下:

J2SE 8 = 52,

J2SE 7 = 51,

J2SE 6.0 = 50,

版权声明:本文为CSDN博主「常一二」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_36193839/article/details/114689841