Java 文件锁//随机流的乱码问题

文件锁

使用文件锁要用到FileLock类FileChannel类,并且结合随机流RandomAccessFile类进行使用
RandomAccessFile创建的流在读/写文件时可以使用文件锁,只要不解除该锁,那么其他程序就无法对被锁的文件进行操作

使用文件锁

  1. 先试用RandomAccessFile流建立指向文件的流对象,模式必须是"rw"
RandomAccessFile input = new RandomAccessFile("Example.java","rw");
  1. input调用方法getChannel()获得一个连接到底层文件的FileChannel对象(信道)
 FileChannel channel = input.getChannel();//获取文件的通道,放到通道对象中
  1. 信道调用tryLock()lock()方法获得一个FileLock(文件锁),这个过程就叫文件加锁
FileLock lock = channel.tryLock();//将通道进行关闭后放到一个锁对象
  1. 当文件加锁后将禁止任何应用程序对文件进行操作或在进行加锁,如果想读写文件那么必须要先解锁
lock.release();//对文件进行解锁

对文件进行加锁的例子

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class myWindow extends JFrame implements ActionListener {
    JButton jButton;
    JTextArea jTextArea;
    File file;
    FileChannel fileChannel;
    FileLock fileLock;
    RandomAccessFile randomAccessFile;
    myWindow(){
        setTitle("文件锁");
        setBounds(300,300,500,500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        init();
        validate();
    }
    void init(){
        jTextArea = new JTextArea();
        add(new JScrollPane(jTextArea), BorderLayout.CENTER);
        jButton = new JButton("输入一行");
        jButton.addActionListener(this);    //设置监视器
        add(jButton,BorderLayout.SOUTH);
        try{
            file = new File("C:\\Users\\Administrator\\Desktop","首页文案.txt");
            randomAccessFile = new RandomAccessFile(file,"rw");
            fileChannel = randomAccessFile.getChannel();    //获取文件的通道
            fileLock = fileChannel.tryLock();   //通道上锁后放到锁对象中
        }
        catch(Exception E){

        }
    }
    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        try{
            fileLock.release();
            String s = randomAccessFile.readLine(); //将读取的每一行放到字符串中
            byte b [] = s.getBytes("ISO-8859-1");   //转换编码,否者会出现乱码
            String content = new String(b);
            jTextArea.append("\n" + content); //读取的一行放到文本框中
            fileLock = fileChannel.tryLock();
            if (s == null)
                randomAccessFile.close();
        }
        catch(Exception e){

        }
    }
}
public class Example12_16 {
    public static void main(String[] args) {
        myWindow myWindow = new myWindow();
    }
}

运行效果图
在这里插入图片描述

解决乱码的问题

RandomAccessFile流调用readLine()方法时读取含有非ASCII字符的文件时就会出现乱码,因为有文字的存在,所以要解决这个问题就要将读到的字符串重新编码然后放到一个byte数组中

  1. 获取每一行字符串后
 String str = in.readLine();	//获取字符串
  1. 用ISO-8859-1重新编码
byte b [ ] = str.getBytes("ISO-8859-1");	//重新编码
  1. 使用当前计算机的默认编码将字节数数组转化为字符串
String content = new String(b);
  1. 最后输出的content就不会是乱码了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值