gpt4 book ai didi

Java - 在eclipse中导出到可执行jar文件后读取文件

转载 作者:行者123 更新时间:2023-11-29 05:03:46 25 4
gpt4 key购买 nike

在 eclipse 中,当我将我的代码导出到可执行 jar 文件时,jar 找不到任何文件。我使用的代码是
FileReader fr = new FileReader("src/pkg/Password.txt");
BufferedReader br = new BufferedReader(fr);
即生成 FileNotFoundException
注意:此代码在 eclipse 中运行良好。有没有一种方法可以在不使用 .getResource().getResourseAsStream() 的情况下正确执行此操作,因为 FileReader 没有带有 URL 或 InputStream 的构造函数

这是我的一个类的代码:

package pkg;

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class MainP extends JPanel {

/**
*
*/
private JButton btnAddCoupon, btnChangeStarCount;
private static final long serialVersionUID = 2669362135801409216L;
private JPasswordField passwordField;
static String s;

/**
* Create the panel.
*/
public MainP() {
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWidths = new int[] { 245, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
gridBagLayout.rowHeights = new int[] { 49, 0, 0, 0, 0, 0 };
gridBagLayout.columnWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE };
gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0,
Double.MIN_VALUE };
setLayout(gridBagLayout);

JButton btnCashIn = new JButton("Cash In");
btnCashIn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MainClass.f2.setVisible(true);
MainClass.f.setVisible(false);

}
});
GridBagConstraints gbc_btnCashIn = new GridBagConstraints();
gbc_btnCashIn.fill = GridBagConstraints.BOTH;
gbc_btnCashIn.insets = new Insets(0, 0, 5, 5);
gbc_btnCashIn.gridx = 0;
gbc_btnCashIn.gridy = 0;
add(btnCashIn, gbc_btnCashIn);

JLabel lblAdminrequiresPassword = new JLabel(
"Admin (Requires Password)");
GridBagConstraints gbc_lblAdminrequiresPassword = new GridBagConstraints();
gbc_lblAdminrequiresPassword.insets = new Insets(0, 0, 5, 0);
gbc_lblAdminrequiresPassword.gridx = 9;
gbc_lblAdminrequiresPassword.gridy = 0;
add(lblAdminrequiresPassword, gbc_lblAdminrequiresPassword);

btnAddCoupon = new JButton("Add Coupon");
btnAddCoupon.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MainClass.f3.setVisible(true);
MainClass.f.setVisible(false);
}
});
GridBagConstraints gbc_btnAddCoupon = new GridBagConstraints();
gbc_btnAddCoupon.insets = new Insets(0, 0, 5, 0);
gbc_btnAddCoupon.gridx = 9;
gbc_btnAddCoupon.gridy = 1;
add(btnAddCoupon, gbc_btnAddCoupon);

btnChangeStarCount = new JButton("Change Star Count");
btnChangeStarCount.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MainClass.f4.setVisible(true);
MainClass.f.setVisible(false);
}
});
GridBagConstraints gbc_btnChangeStarCount = new GridBagConstraints();
gbc_btnChangeStarCount.insets = new Insets(0, 0, 5, 0);
gbc_btnChangeStarCount.gridx = 9;
gbc_btnChangeStarCount.gridy = 2;
add(btnChangeStarCount, gbc_btnChangeStarCount);
enab(false);
passwordField = new JPasswordField();
passwordField.setForeground(Color.red);
passwordField.getDocument().addDocumentListener(new DocumentListener() {

@Override
public void removeUpdate(DocumentEvent e) {
try {
BufferedReader br = new BufferedReader(new FileReader("/pkg/Password.txt"));
s = br.readLine();
if (passwordField.getText().equals(s)) {
passwordField.setForeground(Color.green);
enab(true);
} else {
passwordField.setForeground(Color.red);
enab(false);
}
br.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}

@Override
public void insertUpdate(DocumentEvent e) {
try {
BufferedReader br = new BufferedReader(new FileReader("/pkg/Password.txt"));
s = br.readLine();
if (passwordField.getText().equals(s)) {
passwordField.setForeground(Color.green);
enab(true);
} else {
passwordField.setForeground(Color.red);
enab(false);
}
br.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}

@Override
public void changedUpdate(DocumentEvent e) {
// XXX Do not change XXX
}
});
GridBagConstraints gbc_passwordField = new GridBagConstraints();
gbc_passwordField.insets = new Insets(0, 0, 5, 0);
gbc_passwordField.fill = GridBagConstraints.HORIZONTAL;
gbc_passwordField.gridx = 9;
gbc_passwordField.gridy = 3;
add(passwordField, gbc_passwordField);

JLabel lblPasswordField = new JLabel("Password Field");

GridBagConstraints gbc_lblPasswordField = new GridBagConstraints();
gbc_lblPasswordField.gridx = 9;
gbc_lblPasswordField.gridy = 4;
add(lblPasswordField, gbc_lblPasswordField);

}

private void enab(boolean b) {
btnAddCoupon.setEnabled(b);
btnChangeStarCount.setEnabled(b);
}

}

注意:我尝试同时使用 FileReaderInputStreamReader

目录树:

MyJar.jar (C://Users/Orion31/Desktop/MyJar.jar
|
---- 包装
|
--- 密码.txt
|
--- 星数.txt
|
--- CS.txt

最佳答案

永远不要在任何路径中引用src,一旦程序导出它就不会存在。

所有资源都存储为 zip 文件(Jar 文件)中的条目,这意味着您不能再像现在这样使用任何文件访问方法,而是需要使用 Class#getResourceClass#getResourcesStream 代替

Is there a way to do this properly without using .getResource() or .getResourseAsStream()

没有(或者至少没有,我很乐意讨论)

because there is no constructor for FileReader with a URL or an InputStream

实际上,或者更重要的是,有一种方法,您可以使用 InputStreamReader 而不是 FileReader,例如...

try (BufferedReader reader = new InputStreamReader(getClass().getResourceAsStream("/pkg/Password.txt"))) {
// Read as normal
} catch (IOException exp) {
exp.printStackTrace();
}

关于Java - 在eclipse中导出到可执行jar文件后读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31128576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com