Not reading a file? - java

So I want to read a text file but for some strange reason it can't find the file. I have used these methods before, and I therefore have no idea why this isn't working can someone please help me out?
EDIT:
sorry guys I left out a big piece of info which is that it can find the file when it is writing to it but not when it is reading from it. Thanks for all your guys' help and sorry for wasting your time asking a question I didn't need the answer to... Again sorry.
Some more info:
"Assets.txt" is in both the project's root folder as well as in the src/assetregistry
"Assets.txt" will be there when the program is run
All I get is the JOption messege from the catch exception in the readFromFile() method
According to the properties of assetRegistry the working directory is
"C:\Users\Justin\Documents\NetBeansProjects\assetregistry\src\assetregistry"
Thank you to everyone who helped, especially Chris and Andrew Thompson. The program now work and the following is the updated version. Feel free to copy it if you want. It's really a simple program.
Main class:
package assetregistry;
import java.io.IOException;
import javax.swing.JOptionPane;
public class Assetregistry {
public static void main(String[] args) throws IOException {
new Assetregistry();
}
assetArray aa = new assetArray();
public Assetregistry() throws IOException {
aa.readFromFile ();
char choice = 'Z';
while (choice != 'X') {
choice = menu();
options(choice);
}
}
public char menu() {
char ch = JOptionPane.showInputDialog("\t" + "Welcome to asset registry. Please input your choice" + "\n" + "A: Enter new asset" + "\n" + "B: Calculate depreciation and display" + "\n" + "X: Exit").toUpperCase().charAt(0);
return ch;
}
private void options(char c) throws IOException {
switch (c) {
case 'A':
aa.enterAsset();
break;
case 'B':
aa.calculate();
break;
case 'X':
System.exit(0);
break;
}
}
}
Array/method class
package assetregistry;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;
public class assetArray {
asset[] aArr = new asset[100];
private double year;
private double month;
private int count = 0;
Assetregistry AR;
String home = System.getProperty("user.home");
File userHome = new File(home);
File file = new File(userHome,"Assets.txt");
public assetArray() throws IOException {
}
public void enterAsset() throws IOException {
int choice = JOptionPane.YES_OPTION;
while (choice == JOptionPane.YES_OPTION) {
String name = JOptionPane.showInputDialog("Enter asset name");
double costP = Double.parseDouble(JOptionPane.showInputDialog("Enter the cost price of the asset"));
int lSpan = Integer.parseInt(JOptionPane.showInputDialog("Enter the amount of years you wish to keep the asset"));
double mBought = Double.parseDouble(JOptionPane.showInputDialog("Enter the month the asset was bought (As a number)"));
double yBought = Double.parseDouble(JOptionPane.showInputDialog("Enter the year the asset was bought"));
double depr = (1.00 / lSpan * 100.00);
aArr[count] = new asset(name, costP, lSpan, yBought, mBought, depr);
PrintWriter pw = new PrintWriter(new FileWriter(file, true));
pw.println(aArr[count].toString());
pw.close();
count++;
choice = JOptionPane.showConfirmDialog(null, " Do you want to enter another asset?", " Enter another asset?", JOptionPane.YES_NO_OPTION);
}
}
public void calculate() {
String name;
int lSpan;
double ybought;
double mbought;
double pValue;
double Rate;
double deprExp;
double numYears;
double fValue;
double accDepr;
String[] mnth = new String[12];
mnth[0] = "January";
mnth[1] = "February";
mnth[2] = "March";
mnth[3] = "April";
mnth[4] = "May";
mnth[5] = "June";
mnth[6] = "July";
mnth[7] = "August";
mnth[8] = "September";
mnth[9] = "October";
mnth[10] = "November";
mnth[11] = "December";
if (count > 0) {
year = Integer.parseInt(JOptionPane.showInputDialog("Enter the year you wish to calculate depreciation for"));
month = Integer.parseInt(JOptionPane.showInputDialog("Enter the month you wish to calculate depreciation for"));
int m = (int) month;
int y = (int) year;
System.out.println("Asset regestry" + "\t" + mnth[m-1] + " " + y);
for (int i = 0; i < count; i++) {
name = aArr[i].getName();
lSpan = aArr[i].getLifeSpan();
ybought = aArr[i].getyBought();
mbought = aArr[i].getmBought();
pValue = aArr[i].getCostP();
Rate = aArr[i].getDeprR();
int m2 = (int) mbought;
int y2 = (int) ybought;
deprExp = pValue - (pValue * ((1.00 - ((Rate))) * 1.00 / 100.00));
numYears = (year + (month / 12.00)) - (ybought + mbought / 12.00);
fValue = pValue * (1.00 - (((Rate) * (numYears)) / 100.00));
if (fValue <= 0.00) {
fValue = (int) 1;
}
accDepr = pValue - fValue;
System.out.println("\n" + "Asset: " + name);
System.out.println("Life span: " + lSpan + "yrs");
System.out.println("Cost price: " + "R" + pValue);
System.out.println("Date acquired: " + mnth[m2-1] + " " + y2);
System.out.println("Depreciatin rate (p.a.): " + Rate + "%");
System.out.println("Depreciation(p.a.): R" + deprExp);
System.out.println("Accumulated depreciation: R" + accDepr);
System.out.println("Current book value: R" + fValue);
System.out.println("_________________________________________");
}
} else {
JOptionPane.showMessageDialog(null, "There are no assets in memory", "NO ASSETS!", JOptionPane.ERROR_MESSAGE);
}
}
/**
*
*/
public void readFromFile() {
String line = "";
try {
BufferedReader fr = new BufferedReader(new FileReader(file));
line = fr.readLine();
while (line != null) {
StringTokenizer stk = new StringTokenizer(line, "#");
String name = stk.nextToken();
double costP = Double.parseDouble(stk.nextToken());
int lSpan = Integer.parseInt(stk.nextToken());
double yBought = Double.parseDouble(stk.nextToken());
double mBought = Double.parseDouble(stk.nextToken());
double deprR = Double.parseDouble(stk.nextToken());
aArr[count] = new asset(name, costP, lSpan, yBought, mBought, deprR);
count++;
line = fr.readLine();
}
fr.close();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "There is a file missing.", "FILE MISSING!", JOptionPane.ERROR_MESSAGE);
}
}
}
Assets class
package assetregistry;
/**
*
* #author Justin
*/
public class asset {
private String name;
private double costP;
private int lifeSpan;
private double yBought;
private double mBought;
private double deprR;
public asset(){
}
public asset(String name, double costP, int lifeSpan, double yBought, double mBought, double deprR) {
this.name = name;
this.costP = costP;
this.lifeSpan = lifeSpan;
this.yBought = yBought;
this.mBought = mBought;
this.deprR = deprR;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getCostP() {
return costP;
}
public void setCostP(double costP) {
this.costP = costP;
}
public int getLifeSpan() {
return lifeSpan;
}
public void setLifeSpan(int lifeSpan) {
this.lifeSpan = lifeSpan;
}
public double getyBought() {
return yBought;
}
public void setyBought(double yBought) {
this.yBought = yBought;
}
public double getmBought() {
return mBought;
}
public void setmBought(double mBought) {
this.mBought = mBought;
}
public double getDeprR() {
return deprR;
}
public void setDeprR(double deprR) {
this.deprR = deprR;
}
#Override
public String toString ()
{
String stg = "";
stg += name + "#" + costP + "#" + lifeSpan + "#" + yBought + "#" + mBought + "#" + deprR + "#";
return stg;
}
}

String home = System.getProperty("user.home");
System.out.println("User home directory is: " + home);
File userHome = new File(home);
// Put files in a known and reproducible path!
File file = new File(userHome, "Assets.txt");

It depends where you have put "Assets.txt" in your file system. If you are running the code from inside netbeans, then the line:
File file = new File("Assets.txt");
will be looking for the file in the root folder of your project e.g. */NetBeansProjects/INSERT_PROJECT_NAME/ (if you're not then it will be looking for the file in the same directory the application is running in).I noticed you have the line:
URL url = AR.getClass().getResource("/Assets.txt");
but you never use url in your code. Are you trying to look for the file in the same directory as your "Assetregistry" class and forgot to use url to specify the location? If this is the case then remove the "/" from the beginning of the name and construct the file like this:
URL url = Assetregistry.class.getResource("Assets.txt");
File file = new File(url.toURI());
Hope this helps :)

Related

printf only printing while passing the last index value of an array of class object

I created a class object array and but now when I try to print it using printf method then it doesn't print those values, I tried checking if the values are correct using println and it works fine with it. One more thing which was weird is that when I pass the end index of the array then it prints them. for example class object array is of size 20 (0-19), when I pass 19th index to the method which prints it then it is working but for 0-18 it is not working.
package com.insurance.company;
import java.util.List;
/**
*
* #author Lenovo
*/
public class InsuranceCompany {
private String companyName;
private String telephone;
private String webAddress;
private double brokerPercentage;
private String description;
private List<String> insuranceTypes;
public InsuranceCompany(){}
public InsuranceCompany(String companyName, String telephone, String webAddress, double brokerPercentage, String description, List<String> insuranceTypes) {
this.companyName = companyName;
this.telephone = telephone;
this.webAddress = webAddress;
this.brokerPercentage = brokerPercentage;
this.description = description;
this.insuranceTypes = insuranceTypes;
}
#Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(companyName);
sb.append(" " + telephone);
sb.append(" " + webAddress);
for(int i = 0; i < insuranceTypes.size(); i++){
sb.append(" " + insuranceTypes.get(i));
}
sb.append(" " + brokerPercentage);
sb.append(" " + description);
return sb.toString();
}
public String getCompanyName() {
return companyName;
}
public String getTelephone() {
return telephone;
}
public String getWebAddress() {
return webAddress;
}
public double getBrokerPercentage() {
return brokerPercentage;
}
public String getDescription() {
return description;
}
public List<String> getInsuranceTypes() {
return insuranceTypes;
}
}
package com.insurance.company;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class InsurancePortal {
//function to load data from file
private static String loadDataFromFile(String path)throws Exception{
String data;
data = new String(Files.readAllBytes(Paths.get(path)));
return data;
}
//function to list all insurance companies
private static void listInuranceCompanies(InsuranceCompany[] company){
System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------");
System.out.printf("| %3s | %-20s | %-111s |%n", "ID", "Company Name", "Cover Types");
//System.out.flush();
System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------");
for(int j = 0; j < company.length; j++){
System.out.printf("| %3d | %-20s |", j+1, company[j].getCompanyName());
for(int i = 0; i < 7; i++){
if(i < company[j].getInsuranceTypes().size()){
System.out.printf(" %15S", company[j].getInsuranceTypes().get(i));
}else{
System.out.printf(" %15s", " ");
}
}
System.out.print(" |\n");
System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------");
}
}
//function to search cover
public static void listSingleCompanyDetails(InsuranceCompany selectedCompany){
System.out.println(selectedCompany.getCompanyName()+"\n--------------------------------------------------");
//System.out.flush();
System.out.printf("| %-18S | %-28S |%n", selectedCompany.getCompanyName(), selectedCompany.getDescription());
//System.out.flush();
System.out.println("--------------------------------------------------");
System.out.println("--------------------------------------------------");
System.out.println("--------------------------------------------------");
System.out.println("--------------------------------------------------");
System.out.println("--------------------------------------------------");
}
public static void main(String arge[]) throws Exception{
String dataFile = System.getProperty("user.dir") + File.separator + "insurance-data.txt";
String[] data = loadDataFromFile(dataFile).split("\n");
/*for(String str: data){
System.out.println(str);
}*/
int rows = data.length;
InsuranceCompany[] company = new InsuranceCompany[rows];
//Initialising objects for every row of data in the file
for(int j = 0; j < rows; j++){
String row = data[j];
//System.out.println(row);
String companyName, telephone, webAddress, description;
double brokerPercentage;
List<String> insuranceTypes = new ArrayList<>();
//Splitting for Company Name
String[] splittedArray = row.split(":", 2);
companyName = splittedArray[0];
row = splittedArray[1];
//Splitting for telephone
splittedArray = row.split(":", 2);
telephone = splittedArray[0];
row = splittedArray[1];
//splitting for web address
splittedArray = row.split(":", 2);
webAddress = splittedArray[0];
row = splittedArray[1];
//splitiing for insurance types
splittedArray = row.split(":", 2);
String[] insuranceTypeList = splittedArray[0].split(",");
for(String str : insuranceTypeList){
insuranceTypes.add(str);
}
row = splittedArray[1];
//splitting for broker percentage
splittedArray = row.split(":", 2);
brokerPercentage = Double.parseDouble(splittedArray[0]);
row = splittedArray[1];
//splitting for description
splittedArray = row.split(":", 2);
description = splittedArray[0];
//System.out.println(companyName+ " " + telephone + " " +webAddress + " " + brokerPercentage + " " + description);
/*for(int i = 0; i < insuranceTypes.size(); i++){
System.out.print(insuranceTypes.get(i)+" ");
}*/
company[j] = new InsuranceCompany(companyName, telephone, webAddress, brokerPercentage, description, insuranceTypes);
//System.out.println(company[j].getCompanyName());
}
boolean run = true;
while(run){
int choice;
Scanner sc = new Scanner(System.in);
System.out.print("\nList insurance companies.......1\n"
+ "Select insurance company.......2\n"
+ "Search cover...................3\n"
+ "Exit...........................0\n"
+ "\nEnter choice:> ");
choice = sc.nextInt();
switch(choice){
case 1 :
listInuranceCompanies(company);
break;
case 2 :
System.out.print("Enter company ID from list [1 - "+(company.length)+"] :> ");
int selectedCompany;
selectedCompany = sc.nextInt();
listSingleCompanyDetails(company[selectedCompany-1]);
break;
case 0 :
System.exit(0);
break;
default: System.out.println("Invalid choice!, please try again.");
}
}
}
}

Removing statics from project

Is their an easy way to pass the variables and arrays between these methods without having a super long method signature? Currently I am using these statics but I know that's not the "correct" way of doing it but if I pass them in the signature it starts to make everything look ugly. So what would be the "correct" way to pass the variables like lastName, firstName, and role?
// Program wide variables
//static String firstName; // First name from the file
static String lastName; // Last name from the file
static String username; // Username
static String password;
static String role;
static String email;
static String answersFile; // Answers file in use with path and ext
static String[] answeredQ = new String[questAsks]; // Recording the question asked
static Boolean[] answeredA = new Boolean[questAsks]; //Recording users answer
static Boolean[] answeredC = new Boolean[questAsks]; //Recording the correct answer
public static void main(String Args[]) throws FileNotFoundException, IOException {
// Main method that contains major control functions; a quick summary of the program; magic
}
public static void quiz(String testType) throws HeadlessException, IOException {
String testBankFile = path + testType + ".txt";
Random rand = new Random();
int questionCount = 0, right = 0, wrong = 0;
long startTime = System.currentTimeMillis(); // Setting the start time in milliseconds
while (questionCount < questAsks) { // Loop that will ask all the questions
int r = rand.nextInt(getLines(testBankFile));
boolean ans = promptQuestion(read(r, testBankFile), questionCount + 1); // For some reason this makes it work
answeredQ[questionCount] = read(r, testBankFile);
answeredA[questionCount] = ans;
answeredC[questionCount] = parseA(read(r, answersFile));
if (ans != parseA(read(r, answersFile))) {
wrong++;
} else if (ans == parseA(read(r, answersFile))) {
right++;
}
questionCount++;
}
JOptionPane.showMessageDialog(null, "You got " + wrong + " wrong and " + right + " correct.");
long endDiff = (System.currentTimeMillis() - startTime);
makeReport(firstName, lastName, username, printTime(endDiff), testType, right);
}
// Generates a report report(first, last, score, time, array of answers)
public static void makeReport(String first, String last, String user, String time, String testType, int score) throws IOException {
DateFormat dateF = new SimpleDateFormat(dateFormat);
Date date = new Date();
String fileName = user + "_COSC236_Quiz_" + dateF.format(date) + ".txt";
File file = new File(fileName);
file.createNewFile();
FileWriter out = new FileWriter(fileName);
double percent = (((double) score) / ((double) questAsks) * 100);
out.write("Name: " + first + " " + last + "\n");
out.write("Score: " + percent + "%\n");
out.write("Elapsed time: " + time + "\n");
out.write("Test type: " + testType + "\n");
out.write("---------------------------------------------------------------------\n");
out.write(" Users\tCorrect\tQuestion\n");
for (int i = 0; i < answeredQ.length; i++) {
out.write(i + 1 + ".) ");
out.write(answeredA[i].toString() + "\t");
out.write(answeredC[i].toString() + "\t");
out.write(answeredQ[i] + "\n");
}
out.close();
}
// Boolean login method | login(tries allowed, source file)
public static void login(int tries, String source) throws FileNotFoundException, IOException {
String[] loginInfo;
boolean invalid = false;
for (int x = 0; x < tries; x++) {
invalid = false;
loginInfo = promptLogin();
if (loginInfo[0].toLowerCase().equals("done")) {
System.exit(0);
}
for (int i = 0; i < getLines(source); i++) {
StringTokenizer st = null;
st = new StringTokenizer(read(i, source));
String user = st.nextToken();
String pass = st.nextToken();
if (user.equals(loginInfo[0])) {
if (pass.equals(loginInfo[1])) {
username = loginInfo[0];
password = loginInfo[1];
firstName = st.nextToken();
lastName = st.nextToken();
email = st.nextToken();
role = st.nextToken();
if (role.toLowerCase().equals("instructor")) {
promptInstructor();
JOptionPane.showMessageDialog(null, exitedInstructorMode);
break;
} else {
run();
}
} else {
invalid = true;
}
} else {
invalid = true;
}
}
if(invalid) {
JOptionPane.showMessageDialog(null, invalidLogin);
}
}
JOptionPane.showMessageDialog(null, tooManyAttempts);
}
}
Why not just make a class that holds the values that you need to pass around
Use OOP. Create clss to you object
example:
class User{
String lastName;
String username;
String password;
String role;
String email;
...
public static User login(int tries, String source) throws FileNotFoundException, IOException {
//this you read User param and add new User
return user;
}
}
And now, where you need lastName, username, password, role or email, you can
pass User instance

how to fix blank file IO in java [duplicate]

This question already has answers here:
Blank file after writing to it?
(3 answers)
Closed 5 years ago.
I am newbie in java programming and learning Io. I am making a simple RPG game but got a problem in my code. it's about the file it's blank whenever i finish running it. somehow whenever I run it I got an empty file. can some one help me :c. (sorry for bad English)
here is my code: FOR RANDOM CLASS
public class Dice {
/** instance variables */
private final Random r;
/**
* Initializes the random number generator r
*/
public Dice() {
r = new Random();
}
/**
* Returns a random integer between 1 and 6 using Random r
* #return
*/
public int roll() {
int dieRoll = r.nextInt(6 - 1);
return dieRoll;
}
}
FOR Character CLASS
public class Character {
static Dice dice = new Dice();
private String name;
private int strength;
private int dexterity;
private int intelligence;
private int maxLife;
private int currentLife;
private int atk;
public Character(){
}
public Character(String n, int s, int d, int i) {
this.name = n;
this.strength = s;
this.dexterity = d;
this.intelligence = i;
this.maxLife = 100 + dice.roll();
this.currentLife = maxLife;
}
/**
* Returns a random die roll using the roll method in the Dice.java,
* *modified by the character's strength
*/
public int attack() {
this.atk = strength * dice.roll() + 24;
return atk;
}
public void wound(int damage) {
if ((currentLife - damage) <= 0) {
this.currentLife = 0;
} else {
this.currentLife = currentLife - damage;
}
}
public void heal(int heal) {
if ((currentLife + heal) < maxLife) {
this.currentLife = currentLife + heal;
} else {
this.currentLife = maxLife;
}
}
public boolean checkDead() {
return currentLife == 0;
}
public String getName() {
return name;
}
public int getStrength() {
return strength;
}
/**
* Returns dexterity
*/
public int getDexterity() {
return dexterity;
}
/**
* * Returns intelligence
*/
public int getIntelligence() {
return intelligence;
}
/**
* Returns currentLife
*/
public int getCurrentLife() {
return currentLife;
}
/**
* Returns maxLife
*/
public int getMaxLife() {
return maxLife;
}
public int getAtk() {
return atk;
}
}
FOR MAIN CLASS(HERE IS WERE THE PROBLEM I DONT KNOW IF I LACK SOMETHING HERE)
public class TestCharacter {
public static void main(String letsPlay[]){
PrintWriter outputStream = null;
try{
outputStream = new PrintWriter(new FileOutputStream("RPGOutput.txt",true));
Scanner s = new Scanner(System.in);
System.out.print("Enter Player 1 Character name:");
Character p1 = new Character(s.next(),s.nextInt(),s.nextInt(),s.nextInt());
System.out.println(p1.getName()+ "\tHAS ENTERED THE BATTLE!");
System.out.println("Enter Player 2 Character name:");
Character p2 = new Character(s.next(),s.nextInt(),s.nextInt(),s.nextInt());
System.out.println(p2.getName()+ "\tHAS ENTERED THE BATTLE!");
int i = 1;
do {
outputStream.println("\nR O U N D " + i + "!");
outputStream.print(p1.getName() + " "+"HP is");
outputStream.println("\t" + p1.getCurrentLife() + "/" + p1.getMaxLife());
outputStream.println("while");
outputStream.print(p2.getName() + " " + " HP is");
outputStream.println("\t" + p2.getCurrentLife() + "/" + p2.getMaxLife());
outputStream.println(" ");
p2.wound(p1.attack());
outputStream.println(p1.getName() + " attacks " + p2.getName() + " for " + p1.getAtk() + " damage!");
if (p2.checkDead() == true) {
outputStream.println(p2.getName() + " lose " + p1.getName() + " has won!");
return;
}
p1.wound(p2.attack());
outputStream.println(p2.getName() + " attacks " + p1.getName() + " for " + p2.getAtk() + " damage!");
if (p1.checkDead() == true) {
outputStream.println(p1.getName() + " lose " + p2.getName() + " has won!");
return;
}
i++;
} while (p1.checkDead() == false || p2.checkDead() == false);
}catch(FileNotFoundException e){
System.out.println("Error no file" + e);
System.exit(0);
}
}
}
When you open a stream you should always finally close it.
In java 1.7 and above you just try( ... open the stream here ){ ... useit ...}, the compilers adds the finally close implicitly .
You need to finally close to be sure you don't leave open resources allocated.
It could be wise to set the PrintWriter to autoflush or make sure you flush before closing the stream, if not so maybe the PrintWriter does not write to the output stream until is buffer is full.
Java 1.6 and below
OutputStream fos = null;
try{
fos = new FileOutputStream("RPGOutput.txt",true);
PrintWriter out = new PrintWriter(fos, true);
out.println("Someting");
out.println("...");
//
out.flush();
}catch(IOException e){
// Manage exception
} finally {
try{
if(fos!=null){
fos.close();
}
}catch(IOException e){
// Swallow exception
}
}
Java 1.7 and above
try(OutputStream fos = new FileOutputStream("RPGOutput2.txt",true);
PrintWriter out = new PrintWriter(fos,true);) {
out.println("Hello");
out.print("Hello 2");
} catch (IOException e) {
// Manage exception
}

Exception when trying to instrument source code by WALA: java.lang.ClassFormatError: StackMapTable format error: wrong attribute size

I have a simple program like this:
package tests;
import java.util.Scanner;
public class TestSum {
public static void main(String[] args) {
int sum = 0;
System.out.print("Please enter starting i: ");
int i = new Scanner(System.in).nextInt();
while ( i < 11 ) {
sum = sum + i;
i = i + 1;
}
System.out.println("sum = " + sum);
System.out.println("Ending i = " + i);
}
}
I built this into a jar file and I want to use WALA to add more instrumented source code to count the number of loop execution for dynamic analysis purpose.
This is what I have done by using Wala, most of the stuffs is taken from this example Wala Bench Example
import com.ibm.wala.shrikeBT.*;
import com.ibm.wala.shrikeBT.analysis.Verifier;
import com.ibm.wala.shrikeBT.shrikeCT.CTDecoder;
import com.ibm.wala.shrikeBT.shrikeCT.ClassInstrumenter;
import com.ibm.wala.shrikeBT.shrikeCT.OfflineInstrumenter;
import com.ibm.wala.shrikeCT.ClassWriter;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.PrintStream;
import java.io.Writer;
/**
* Created by quocnghi on 2/2/17.
*/
public class InstrumentedTest {
private final static boolean disasm = true;
private final static boolean verify = true;
private static OfflineInstrumenter instrumenter = new OfflineInstrumenter(true);
public static void main(String[] args) throws Exception {
for (int i = 0; i < 1; i++) {
Writer w = new BufferedWriter(new FileWriter("report", false));
args = instrumenter.parseStandardArgs(args);
instrumenter.setPassUnmodifiedClasses(true);
instrumenter.beginTraversal();
ClassInstrumenter ci;
while ((ci = instrumenter.nextClass()) != null) {
doClass(ci, w);
}
instrumenter.close();
}
}
static final String fieldName = "_Bench_enable_trace";
// Keep these commonly used instructions around
static final Instruction getSysOut = Util.makeGet(System.class, "out");
static final Instruction callPrintln = Util.makeInvoke(PrintStream.class, "println", new Class[]{String.class});
private static void doClass(final ClassInstrumenter ci, Writer w) throws Exception {
final String className = ci.getReader().getName();
System.out.println("Class name : " + className);
w.write("Class: " + className + "\n");
w.flush();
for (int m = 0; m < ci.getReader().getMethodCount(); m++) {
MethodData d = ci.visitMethod(m);
System.out.println(d.getName());
// d could be null, e.g., if the method is abstract or native
if (d != null) {
w.write("Instrumenting " + ci.getReader().getMethodName(m) + " " + ci.getReader().getMethodType(m) + ":\n");
w.flush();
if (disasm) {
w.write("Initial ShrikeBT code:\n");
(new Disassembler(d)).disassembleTo(w);
w.flush();
}
if (verify) {
Verifier v = new Verifier(d);
v.verify();
}
MethodEditor methodEditor = new MethodEditor(d);
methodEditor.beginPass();
final int noTraceLabel = methodEditor.allocateLabel();
IInstruction[] instr = methodEditor.getInstructions();
final String msg0 = "Loop called at " + Util.makeClass("L" + ci.getReader().getName() + ";") + "."
+ ci.getReader().getMethodName(m);
int i = 0;
for (IInstruction in : instr) {
if (in instanceof ConditionalBranchInstruction) {
int b = i;
methodEditor.insertBefore(i, new MethodEditor.Patch() {
#Override
public void emitTo(MethodEditor.Output w) {
w.emit(getSysOut);
w.emit(ConstantInstruction.makeString(msg0));
w.emit(callPrintln);
w.emitLabel(noTraceLabel);
}
});
}
i++;
System.out.println(in.toString());
}
methodEditor.applyPatches();
if (disasm) {
w.write("Final ShrikeBT code:\n");
(new Disassembler(d)).disassembleTo(w);
w.flush();
}
}
}
ClassWriter cw = ci.emitClass();
instrumenter.outputModifiedClass(ci, cw);
}
}
I expect that after adding more instrumented code, the program should become like this, which add a line System.out.println in the loop :
package tests;
import java.util.Scanner;
public class TestSum {
public static void main(String[] args) {
int sum = 0;
System.out.print("Please enter starting i: ");
int i = new Scanner(System.in).nextInt();
while ( i < 11 ) {
sum = sum + i;
i = i + 1;
System.out.println("One count for this loop");
}
System.out.println("sum = " + sum);
System.out.println("Ending i = " + i);
}
}
But I got this error :
java.lang.ClassFormatError: StackMapTable format error: wrong attribute size
WALA does have StackMapTable support, but perhaps something is broken. I suggest filing an issue.

How to parse a String into multiple arrays

Good day!
I am making a mini bookstore program and we are required to read a file based from what the customer buys on the specified counter as follows:
counter 4,book1 2,book2 2,book3 2,tender 100.00
counter 1,book1 2,book2 1,book3 3, book4 5,tender 200.00
counter 1,book3 1,tender 50.00
In short the format is:
COUNTER -> ITEMS BOUGHT -> TENDER
I tried doing this but it is not that efficient:
public List<String> getOrder(int i) {
List <String> tempQty = new ArrayList<String>();
String[] orders = orderList.get(0).split(",");
for (String order : orders) {
String[] fields = order.split(" ");
tempQty.add(fields[i]);
}
return tempQty;
}
How can i read the file and at the same time, ensures that I will put it on the correct array? Besides the counter and the tender, I need to know the name of the book and the qty so I could get its price and computer for the total price. Do I need to do multiple arrays to store each values? Any suggestions/ codes will be
highly appreciated.
Thank you.
Map<String, Integer> itemsBought = new HashMap<String, Integer>();
final String COUNTER = "counter";
final String TENDER = "tender";
String[] splitted = s.split(",");
for (String str : splitted) {
str = str.trim();
if (str.startsWith(COUNTER)) {
//do what you want with counter
} else if (str.startsWith(TENDER)) {
//do what you want with tender
} else {
//process items, e.g:
String[] itemInfo = str.split(" ");
itemsBought.put(itemInfo[0], Integer.valueOf(itemInfo[1]));
}
}
How about this? Here we have a class that is modeling a purchase, containing counter, tender and a list of the bought items. The bought item consists of an id (e.g. book1) and a quantity. Use the method readPurchases() to read the contents of a file and get a list of purchases.
Does this solve your problem?
public class Purchase {
private final int counter;
private final List<BoughtItem> boughtItems;
private final double tender;
public Purchase(int counter, List<BoughtItem> boughtItems, double tender) {
this.counter = counter;
this.boughtItems = new ArrayList<BoughtItem>(boughtItems);
this.tender = tender;
}
public int getCounter() {
return counter;
}
public List<BoughtItem> getBoughtItems() {
return boughtItems;
}
public double getTender() {
return tender;
}
}
public class BoughtItem {
private final String id;
private final int quantity;
public BoughtItem(String id, int quantity) {
this.id = id;
this.quantity = quantity;
}
public String getId() {
return id;
}
public int getQuantity() {
return quantity;
}
}
public class Bookstore {
/**
* Reads purchases from the given file.
*
* #param file The file to read from, never <code>null</code>.
* #return A list of all purchases in the file. If there are no
* purchases in the file, i.e. the file is empty, an empty list
* is returned
* #throws IOException If the file cannot be read or does not contain
* correct data.
*/
public List<Purchase> readPurchases(File file) throws IOException {
List<Purchase> purchases = new ArrayList<Purchase>();
BufferedReader lines = new BufferedReader(new FileReader(file));
String line;
for (int lineNum = 0; (line = lines.readLine()) != null; lineNum++) {
String[] fields = line.split(",");
if (fields.length < 2) {
throw new IOException("Line " + lineNum + " of file " + file + " has wrong number of fields");
}
// Read counter field
int counter;
try {
String counterField = fields[0];
counter = Integer.parseInt(counterField.substring(counterField.indexOf(' ') + 1));
} catch (Exception ex) {
throw new IOException("Counter field on line " + lineNum + " of file " + file + " corrupt");
}
// Read tender field
double tender;
try {
String tenderField = fields[fields.length - 1];
tender = Double.parseDouble(tenderField.substring(tenderField.indexOf(' ') + 1));
} catch (Exception ex) {
throw new IOException("Tender field on line " + lineNum + " of file " + file + " corrupt");
}
// Read bought items
List<BoughtItem> boughtItems = new ArrayList<BoughtItem>();
for (int i = 1; i < fields.length - 1; i++) {
String id;
int quantity;
try {
String bookField = fields[i];
id = bookField.substring(0, bookField.indexOf(' '));
quantity = Integer.parseInt(bookField.substring(bookField.indexOf(' ') + 1));
BoughtItem boughtItem = new BoughtItem(id, quantity);
boughtItems.add(boughtItem);
} catch (Exception ex) {
throw new IOException("Cannot read items from line " + lineNum + " of file " + file);
}
}
// We're done with this line!
Purchase purchase = new Purchase(counter, boughtItems, tender);
purchases.add(purchase);
}
return purchases;
}
}

Categories

Resources